From cdef0b216d3fb8187ae054fac96c8d2287863129 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 09:40:24 +0800 Subject: [PATCH 01/50] =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E9=99=90=E5=88=B6=E5=9C=A88=E6=8A=98=E4=BB=A5=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 8fb0b81c9..42ef9ac13 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -21,7 +21,7 @@ import ( const ( DefActSkuStock = 200 // 缺省活动库存 - maxDiscount4SkuSecKill = 99 + maxDiscount4SkuSecKill = 80 minDiscount4SkuDirectDown = 0 ) From 7ca6e2970f308c3ee6e3d0d6e67bcf72374ffc3a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 09:42:22 +0800 Subject: [PATCH 02/50] =?UTF-8?q?=E5=8F=AA=E5=9C=A8=E5=BE=85=E6=8B=A3?= =?UTF-8?q?=E8=B4=A7=E7=8A=B6=E6=80=81=EF=BC=8C=E6=89=8D=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E8=BD=AC=E4=B8=89=E6=96=B9=E6=98=AF=E5=90=A6=E6=BB=A1=E8=B6=B3?= =?UTF-8?q?=E6=9C=80=E4=BD=8E=E6=97=B6=E9=97=B4=E8=A6=81=E6=B1=82isPossibl?= =?UTF-8?q?eSwitch2SelfDelivery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/scheduler/defsch/defsch_ext.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index b316114ca..47be0dbae 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -94,10 +94,9 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) { if order.Status < model.OrderStatusFinishedPickup { err = fmt.Errorf("拣货完成后才能转自配送") - } else if order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusDelivering { - if time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { - err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) - } + } else if order.Status == model.OrderStatusFinishedPickup && + time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { + err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) } else if order.Status >= model.OrderStatusDelivering && order.Status < model.OrderStatusEndBegin { if model.IsOrderHaveOwnWaybill(order) { err = fmt.Errorf("%s物流已在配送中,不能转自配送", jxutils.GetVendorName(order.VendorID)) From 3269a059a7f77cac3606e942e95ca247f09d9e32 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 10:27:07 +0800 Subject: [PATCH 03/50] =?UTF-8?q?UserDeliveryAddress=E6=B7=BB=E5=8A=A0Deta?= =?UTF-8?q?ilAddress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/user.go | 7 ++++--- controllers/cms_user2.go | 9 +++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/business/model/user.go b/business/model/user.go index 3f475a3df..5a4b52ac3 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -116,9 +116,10 @@ type UserDeliveryAddress struct { Tag string `orm:"size(32)" json:"tag"` ConsigneeName string `orm:"size(32)" json:"consigneeName"` ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` - Address string `orm:"size(255)" json:"address"` // 这个是用户手输入的详细地址 - Lng float64 `orm:"digits(10);decimals(6)" json:"lng"` // 乘了10的6次方 - Lat float64 `orm:"digits(10);decimals(6)" json:"lat"` // 乘了10的6次方 + Address string `orm:"size(255)" json:"address"` // 地址(区县以下,门牌号以上的地址信息) + DetailAddress string `orm:"size(255)" json:"detailAddress"` // 门牌号 + Lng float64 `orm:"digits(10);decimals(6)" json:"lng"` + Lat float64 `orm:"digits(10);decimals(6)" json:"lat"` AutoAddress string `orm:"size(255)" json:"autoAddress"` // 这个是通过坐标自动获取的结构化的地址 CityCode int `orm:"default(0);null" json:"cityCode"` // 根据坐标获得 diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index 17a2a7e30..83b1658f6 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -255,19 +255,19 @@ func (c *User2Controller) TransferLegacyWeixins() { // @Param token header string true "认证token" // @Param consigneeName formData string true "收货人" // @Param consigneeMobile formData string true "收货人手机" -// @Param address formData string true "详细地址" +// @Param address formData string false "地址(区县以下,门牌号以上的地址信息)" +// @Param detailAddress formData string false "门牌号" // @Param lng formData float64 true "经度" // @Param lat formData float64 true "纬度" // @Param tag formData string false "标签" // @Param remark formData string false "备注" -// @Param isDefault formData bool false "是否是默认" +// @Param isDefault formData int false "是否是默认" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /AddMyDeliveryAddress [post] func (c *User2Controller) AddMyDeliveryAddress() { c.callAddMyDeliveryAddress(func(params *tUser2AddMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) { var address *model.UserDeliveryAddress - params.MapData["isDefault"] = utils.Bool2Int(params.IsDefault) if err = utils.Map2StructByJson(params.MapData, &address, true); err == nil { retVal, err = cms.AddMyDeliveryAddress(params.Ctx, address) } @@ -295,7 +295,8 @@ func (c *User2Controller) DeleteMyDeliveryAddress() { // @Param addressID formData int true "地址ID" // @Param consigneeName formData string false "收货人" // @Param consigneeMobile formData string false "收货人手机" -// @Param address formData string false "详细地址" +// @Param address formData string false "地址(区县以下,门牌号以上的地址信息)" +// @Param detailAddress formData string false "门牌号" // @Param lng formData float64 false "经度" // @Param lat formData float64 false "纬度" // @Param tag formData string false "标签" From c0a43cf06448902210b675aeb63523a4bbd5603a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 10:31:38 +0800 Subject: [PATCH 04/50] fix ammend to amend --- business/jxstore/cms/sync_store_sku.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index b54a2f2aa..05588d1dd 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -22,9 +22,9 @@ import ( ) const ( - AmmendPruneOnlyAmend = 1 - AmmendPruneOnlyPrune = 2 - AmmendPruneAll = 3 + AmendPruneOnlyAmend = 1 + AmendPruneOnlyPrune = 2 + AmendPruneAll = 3 ) var ( @@ -588,10 +588,10 @@ func fillRemoteCatMap(catList []*partner.BareCategoryInfo, catMap map[string]int // 清除京西没有,平台有的商品与商家分类 // todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删 func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { - return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyPrune) + return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyPrune) } -func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int) (hint string, err error) { +func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int) (hint string, err error) { handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) if handler == nil { return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) @@ -636,7 +636,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, } } case 1: - if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeSkuBindIDs) > 0 { + if (opType == AmendPruneOnlyAmend || opType == AmendPruneAll) && len(storeSkuBindIDs) > 0 { for _, bindID := range storeSkuBindIDs { fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) skuBind := &model.StoreSkuBind{} @@ -645,7 +645,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, } } - if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(sku2Delete) > 0 { + if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(sku2Delete) > 0 { _, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { _, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList) return nil, 0, err @@ -677,7 +677,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, } } case 3: - if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeCatBindIDs) > 0 { + if (opType == AmendPruneOnlyAmend || opType == AmendPruneAll) && len(storeCatBindIDs) > 0 { for _, bindID := range storeCatBindIDs { fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) catBind := &model.StoreSkuCategoryMap{} @@ -686,7 +686,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, } } - if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(cat2Delete) > 0 { + if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(cat2Delete) > 0 { for i := 0; i < 2; i++ { level := 2 - i var levelCat2Delete []*partner.BareCategoryInfo @@ -722,7 +722,7 @@ func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, // 把京西有,平台无且没有待创建标记的商品加上待创建标记 func AddCreateFlagForJxStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { - return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyAmend) + return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyAmend) // handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) // if handler == nil { // return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) From a91c513eed03936b650dba533044835b6ba5d6f0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 10:54:11 +0800 Subject: [PATCH 05/50] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BE=8E=E5=9B=A2?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0app=5Ffood=5Fcode=E5=8F=AF=E8=83=BD=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E6=83=85=E5=86=B5amendAndPruneStoreStuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 05588d1dd..02be90ef5 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -620,12 +620,20 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v if err = err2; err == nil { remoteSkuMap := make(map[int]int) for _, v := range remoteSkuList { - remoteSkuMap[v.SkuList[0].SkuID] = 1 - if localSkuMap[v.SkuList[0].SkuID] == nil { - sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{ - SkuID: v.SkuList[0].SkuID, - VendorSkuID: v.SkuList[0].VendorSkuID, - }) + if skuID := v.SkuList[0].SkuID; skuID > 0 { + if localSkuMap[skuID] == nil || + remoteSkuMap[skuID] == 1 /*skuID在平台重复,典型的是美团可能会出现此类情况*/ { + sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{ + SkuID: skuID, + VendorSkuID: v.SkuList[0].VendorSkuID, + }) + } + if remoteSkuMap[skuID] == 0 { + remoteSkuMap[skuID] = 1 + } else { + // 重复的删除后,再打上待创建标记 + remoteSkuMap[skuID] = 0 + } } } From ce2bdf4033bc13ba463b74537aaad2449faada04 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 10:57:12 +0800 Subject: [PATCH 06/50] addressID to id --- controllers/cms_user2.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index 83b1658f6..474d286c3 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -278,13 +278,13 @@ func (c *User2Controller) AddMyDeliveryAddress() { // @Title 用户自己删除配送地址 // @Description 用户自己删除送地址 // @Param token header string true "认证token" -// @Param addressID query int true "地址ID" +// @Param id query int true "地址ID" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /DeleteMyDeliveryAddress [delete] func (c *User2Controller) DeleteMyDeliveryAddress() { c.callDeleteMyDeliveryAddress(func(params *tUser2DeleteMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) { - err = cms.DeleteMyDeliveryAddress(params.Ctx, params.AddressID) + err = cms.DeleteMyDeliveryAddress(params.Ctx, params.Id) return retVal, "", err }) } @@ -292,7 +292,7 @@ func (c *User2Controller) DeleteMyDeliveryAddress() { // @Title 用户自己修改配送地址 // @Description 用户自己修改配送地址 // @Param token header string true "认证token" -// @Param addressID formData int true "地址ID" +// @Param id formData int true "地址ID" // @Param consigneeName formData string false "收货人" // @Param consigneeMobile formData string false "收货人手机" // @Param address formData string false "地址(区县以下,门牌号以上的地址信息)" @@ -307,7 +307,7 @@ func (c *User2Controller) DeleteMyDeliveryAddress() { // @router /UpdateMyDeliveryAddress [put] func (c *User2Controller) UpdateMyDeliveryAddress() { c.callUpdateMyDeliveryAddress(func(params *tUser2UpdateMyDeliveryAddressParams) (retVal interface{}, errCode string, err error) { - err = cms.UpdateMyDeliveryAddress(params.Ctx, params.AddressID, params.MapData) + err = cms.UpdateMyDeliveryAddress(params.Ctx, params.Id, params.MapData) return retVal, "", err }) } From 2534f8bdf722beb7e5bf0ff9797a08ce8e3e4a68 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 11:27:42 +0800 Subject: [PATCH 07/50] ignore *.code-workspace --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 28feacaee..093f63d3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*.code-workspace + jx-callback *.tmp swagger/ From 1e3bdd4b7055d1ce3cc29f0be3322689509fc6fc Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 14:31:08 +0800 Subject: [PATCH 08/50] up --- business/jxstore/cms/user2.go | 8 ++++---- controllers/cms_user2.go | 9 ++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 95884fcd7..458ebd3e6 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -684,16 +684,16 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems return err } -func LoadUserCart(ctx *jxcontext.Context, userID string, storeID int) (cartItems []*model.UserCartItem, err error) { - if userID == "" || storeID == 0 { +func LoadUserCart(ctx *jxcontext.Context, userID string, storeIDs []int) (cartItems []*model.UserCartItem, err error) { + if userID == "" || len(storeIDs) == 0 { return nil, fmt.Errorf("用户与门店必须要指定") } sql := ` SELECT t1.* FROM user_cart_item t1 - WHERE t1.user_id = ? AND t1.store_id = ? + WHERE t1.user_id = ? AND t1.store_id IN (` + dao.GenQuestionMarks(len(storeIDs)) + `) ORDER BY t1.sku_id ` - err = dao.GetRows(dao.GetDB(), &cartItems, sql, userID, storeID) + err = dao.GetRows(dao.GetDB(), &cartItems, sql, userID, storeIDs) return cartItems, err } diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index 474d286c3..e0b3a6d7f 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -328,14 +328,17 @@ func (c *User2Controller) QueryMyDeliveryAddress() { // @Title 得到用户指定门店的购物车信息 // @Description 得到用户指定门店的购物车信息 // @Param token header string true "认证token" -// @Param storeID query int true "门店ID" +// @Param storeIDs query string true "门店ID" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /LoadMyCart [get] func (c *User2Controller) LoadMyCart() { c.callLoadMyCart(func(params *tUser2LoadMyCartParams) (retVal interface{}, errCode string, err error) { _, userID := params.Ctx.GetMobileAndUserID() - retVal, err = cms.LoadUserCart(params.Ctx, userID, params.StoreID) + var storeIDs []int + if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs); err == nil { + retVal, err = cms.LoadUserCart(params.Ctx, userID, storeIDs) + } return retVal, "", err }) } @@ -344,7 +347,7 @@ func (c *User2Controller) LoadMyCart() { // @Description 存储用户指定门店的购物车信息 // @Param token header string true "认证token" // @Param storeID formData int true "门店ID" -// @Param payload formData string true "完整的购物车商品列表" +// @Param payload formData string false "完整的购物车商品列表" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /SaveMyCart [post] From 63e82b35ab2cdbe7e3c78c0049eecdcd7ba8c800 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 14:56:50 +0800 Subject: [PATCH 09/50] up --- business/jxstore/cms/user2.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 458ebd3e6..7ced20dc8 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -680,7 +680,9 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems if err != nil { return err } - err = dao.CreateMultiEntities(dao.GetDB(), cartItems) + if len(cartItems) > 0 { + err = dao.CreateMultiEntities(dao.GetDB(), cartItems) + } return err } From 81188aeb8886cf588565b00e10991f8f19cf448d Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 15:34:33 +0800 Subject: [PATCH 10/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSaveUserCart=E4=B8=AD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=BB=93=E6=9D=9F=E4=BA=8B=E5=8A=A1=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/user2.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 7ced20dc8..e3decf975 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -683,6 +683,9 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems if len(cartItems) > 0 { err = dao.CreateMultiEntities(dao.GetDB(), cartItems) } + if err == nil { + dao.Commit(db) + } return err } From 6e89cfbe216cb51abe817bfffaa062c26c6df281 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 15:37:44 +0800 Subject: [PATCH 11/50] up --- business/jxstore/cms/user2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index e3decf975..2adf97a1a 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -681,7 +681,7 @@ func SaveUserCart(ctx *jxcontext.Context, userID string, storeID int, cartItems return err } if len(cartItems) > 0 { - err = dao.CreateMultiEntities(dao.GetDB(), cartItems) + err = dao.CreateMultiEntities(db, cartItems) } if err == nil { dao.Commit(db) From d8f9e65e1aa43b3ef326ddea64660cc7bd539684 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 15:43:38 +0800 Subject: [PATCH 12/50] =?UTF-8?q?UserCartItem=E6=B7=BB=E5=8A=A0IsChecked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/user.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/business/model/user.go b/business/model/user.go index 5a4b52ac3..a4b3e198f 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -143,11 +143,12 @@ type UserCartItem struct { UserID string `orm:"size(48);column(user_id)" json:"userID"` StoreID int `orm:"column(store_id)" json:"storeID"` - SkuID int `orm:"column(sku_id)"` + SkuID int `orm:"column(sku_id)" json:"skuID"` ActID int `orm:"column(act_id)" json:"actID"` - Count int `json:"count"` - Price int `json:"price"` + Count int `json:"count"` + Price int `json:"price"` + IsChecked int8 `json:"isChecked"` } func (*UserCartItem) TableUnique() [][]string { From 543d14f9637a4f83ba02c35a575d612ee33eab0b Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 16:07:09 +0800 Subject: [PATCH 13/50] =?UTF-8?q?DeleteStoreCategory=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0level=E5=8F=82=E6=95=B0=20mtwm=E6=94=B9?= =?UTF-8?q?=E7=94=A8RetailCatSkuBatchDelete2=E6=9D=A5=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=95=86=E5=AE=B6=E5=88=86=E7=B1=BB=EF=BC=88=E8=BF=99=E6=A0=B7?= =?UTF-8?q?=E5=8F=AF=E4=BF=9D=E8=AF=81=E5=BF=85=E9=A1=BB=E8=83=BD=E5=88=A0?= =?UTF-8?q?=E9=99=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 4 ++-- business/partner/partner_store_sku.go | 2 +- business/partner/purchase/ebai/store_sku2.go | 2 +- business/partner/purchase/mtwm/store_sku2.go | 20 ++++++++++++++++--- .../partner/purchase/weimob/wsc/store_sku2.go | 2 +- business/partner/putils/store_sku.go | 2 +- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 02be90ef5..d63747668 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -82,7 +82,7 @@ func SyncStorCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor storeCatMap.ID = catInfo.MapID if model.IsSyncStatusDelete(catInfo.StoreCatSyncStatus) { // 删除 if model.IsSyncStatusDelete(catInfo.StoreCatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { - err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID) + err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level) if err != nil && handler.IsErrCategoryNotExist(err) { err = nil } @@ -707,7 +707,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除本地不存在的远程分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { cat := batchItemList[0].(*partner.BareCategoryInfo) - err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, cat.VendorCatID) + err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, cat.VendorCatID, level) return nil, err }, levelCat2Delete) tasksch.HandleTask(task4Delete, task, true).Run() diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index ef9c654a0..605d7b458 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -149,7 +149,7 @@ type ISingleStoreStoreSkuHandler interface { GetStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, catName string) (cat *BareCategoryInfo, err error) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) - DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) + DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) DeleteStoreAllCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, isContinueWhenError bool) (err error) IsErrCategoryExist(err error) (isExist bool) diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index a4f0290f8..f9d99cba1 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -95,7 +95,7 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in return err } -func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) { +func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { if globals.EnableEbaiStoreWrite { err = api.EbaiAPI.ShopCategoryDelete(utils.Int2Str(storeID), utils.Str2Int64WithDefault(vendorCatID, 0)) } diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index f30aae9aa..7eb233e51 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -162,9 +162,23 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in return p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat) } -func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string) (err error) { - if globals.EnableMtwmStoreWrite { - err = api.MtwmAPI.RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID) +func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { + if false { + if globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID) + } + } else { + var catCodes []string + if catCode := tryCatName2Code(vendorCatID); catCode != "" { + catCodes = []string{catCode} + } + if globals.EnableMtwmStoreWrite { + if level == 1 { + err = api.MtwmAPI.RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil) + } else { + err = api.MtwmAPI.RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil) + } + } } return err } diff --git a/business/partner/purchase/weimob/wsc/store_sku2.go b/business/partner/purchase/weimob/wsc/store_sku2.go index 64804c785..8c5bf18d2 100644 --- a/business/partner/purchase/weimob/wsc/store_sku2.go +++ b/business/partner/purchase/weimob/wsc/store_sku2.go @@ -64,7 +64,7 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, vendorStor return err } -func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, vendorStoreID, vendorCatID string) (err error) { +func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, vendorStoreID, vendorCatID string, level int) (err error) { if globals.EnableWscStoreWrite { err = api.WeimobAPI.UpdateClassify(utils.Str2Int64WithDefault(vendorCatID, 0), composeFakeDelName(vendorCatID), "") } diff --git a/business/partner/putils/store_sku.go b/business/partner/putils/store_sku.go index 557c17654..c01d99252 100644 --- a/business/partner/putils/store_sku.go +++ b/business/partner/putils/store_sku.go @@ -58,7 +58,7 @@ func (p *DefSingleStorePlatform) DeleteStoreAllCategories(ctx *jxcontext.Context vendorCatIDs[k] = v.VendorCatID } err = FreeBatchCategoryIDOp(func(vendorCatID string) (err error) { - return p.DeleteStoreCategory(ctx, storeID, vendorStoreID, vendorCatID) + return p.DeleteStoreCategory(ctx, storeID, vendorStoreID, vendorCatID, step) }, ctx, task, vendorCatIDs, isContinueWhenError) return nil, err }, len(levelList)) From d4f9df6a0abd25bbd780f26e734d79bc332cafd5 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 16:31:50 +0800 Subject: [PATCH 14/50] =?UTF-8?q?checkRemoteCatExist=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=98=AF=E5=90=A6=E4=B8=80=E8=87=B4=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E8=A6=81=E5=88=A4=E6=96=ADLevel=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 34 +++++++++++--------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index d63747668..af0119781 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -568,23 +568,22 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo return err } -func checkRemoteCatExist(localCatMap map[string]*dao.SkuStoreCatInfo, catList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) { - for _, v := range catList { - if localCatMap[v.VendorCatID] == nil && localCatMap[v.Name] == nil { - cat2Delete = append(cat2Delete, v) +func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string]*dao.SkuStoreCatInfo, remoteCatList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) { + for _, v := range remoteCatList { + localCat := localCatMap[v.VendorCatID] + if localCat == nil { + localCat = localCatMap[v.Name] } - cat2Delete = append(cat2Delete, checkRemoteCatExist(localCatMap, v.Children)...) + if localCat == nil || v.Level != int(localCat.Level) { + cat2Delete = append(cat2Delete, v) + } else { + outRemoteCatMap[v.VendorCatID] = 1 + } + cat2Delete = append(cat2Delete, checkRemoteCatExist(outRemoteCatMap, localCatMap, v.Children)...) } return cat2Delete } -func fillRemoteCatMap(catList []*partner.BareCategoryInfo, catMap map[string]int) { - for _, v := range catList { - catMap[v.VendorCatID] = 1 - fillRemoteCatMap(v.Children, catMap) - } -} - // 清除京西没有,平台有的商品与商家分类 // todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删 func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { @@ -627,12 +626,8 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v SkuID: skuID, VendorSkuID: v.SkuList[0].VendorSkuID, }) - } - if remoteSkuMap[skuID] == 0 { - remoteSkuMap[skuID] = 1 } else { - // 重复的删除后,再打上待创建标记 - remoteSkuMap[skuID] = 0 + remoteSkuMap[skuID] = 1 } } } @@ -674,10 +669,9 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v remoteCatList, err2 := handler.GetStoreAllCategories(ctx, storeID, vendorStoreID) if err = err2; err == nil { - cat2Delete = checkRemoteCatExist(localCatMap, remoteCatList) - remoteCatMap := make(map[string]int) - fillRemoteCatMap(remoteCatList, remoteCatMap) + cat2Delete = checkRemoteCatExist(remoteCatMap, localCatMap, remoteCatList) + for _, v := range localCatList { if remoteCatMap[v.VendorCatID] == 0 && !model.IsSyncStatusNew(v.StoreCatSyncStatus) && !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 { storeCatBindIDs = append(storeCatBindIDs, v.MapID) From 72d965731deefef2d478506878a3d4c885b2f1af Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 17:31:32 +0800 Subject: [PATCH 15/50] =?UTF-8?q?amendAndPruneStoreStuff=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=B7=B2=E5=AD=98=E5=9C=A8=E5=95=86=E5=93=81=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 111 ++++++++----------------- 1 file changed, 35 insertions(+), 76 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index af0119781..da3aa113e 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -587,10 +587,10 @@ func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string] // 清除京西没有,平台有的商品与商家分类 // todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删 func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { - return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyPrune) + return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyPrune, false) } -func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int) (hint string, err error) { +func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) { handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) if handler == nil { return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) @@ -599,7 +599,6 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v var sku2Delete []*partner.StoreSkuInfo var cat2Delete []*partner.BareCategoryInfo - var storeSkuBindIDs, storeCatBindIDs []int task := tasksch.NewParallelTask(fmt.Sprintf("修补平台:%s上的门店商品与分类", model.VendorChineseNames[vendorID]), tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { @@ -632,22 +631,27 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v } } - for _, v := range localSkuList { - if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 { - storeSkuBindIDs = append(storeSkuBindIDs, v.BindID) + if opType == AmendPruneOnlyAmend || opType == AmendPruneAll { + for _, v := range localSkuList { + if !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 { + syncStatus := 0 + if remoteSkuMap[v.SkuID] == 0 { + if !model.IsSyncStatusNew(v.StoreSkuSyncStatus) { + syncStatus = model.SyncFlagNewMask + } + } else if isForceUpdate && !model.IsSyncStatusUpdate(v.StoreSkuSyncStatus) { + syncStatus = model.SyncFlagModifiedMask + } + if syncStatus != 0 { + skuBind := &model.StoreSkuBind{} + skuBind.ID = v.BindID + dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), syncStatus) + } + } } } } case 1: - if (opType == AmendPruneOnlyAmend || opType == AmendPruneAll) && len(storeSkuBindIDs) > 0 { - for _, bindID := range storeSkuBindIDs { - fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) - skuBind := &model.StoreSkuBind{} - skuBind.ID = bindID - dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask) - } - } - if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(sku2Delete) > 0 { _, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { _, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList) @@ -673,21 +677,24 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v cat2Delete = checkRemoteCatExist(remoteCatMap, localCatMap, remoteCatList) for _, v := range localCatList { - if remoteCatMap[v.VendorCatID] == 0 && !model.IsSyncStatusNew(v.StoreCatSyncStatus) && !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 { - storeCatBindIDs = append(storeCatBindIDs, v.MapID) + if !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 { + syncStatus := 0 + if remoteCatMap[v.VendorCatID] == 0 { + if !model.IsSyncStatusNew(v.StoreCatSyncStatus) { + syncStatus = model.SyncFlagNewMask + } + } else if isForceUpdate && !model.IsSyncStatusUpdate(v.StoreCatSyncStatus) { + syncStatus = model.SyncFlagModifiedMask + } + if syncStatus != 0 { + catBind := &model.StoreSkuCategoryMap{} + catBind.ID = v.MapID + dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, catBind, nil, ctx.GetUserName(), nil, dao.GetSyncStatusStructField(model.VendorNames[vendorID]), syncStatus) + } } } } case 3: - if (opType == AmendPruneOnlyAmend || opType == AmendPruneAll) && len(storeCatBindIDs) > 0 { - for _, bindID := range storeCatBindIDs { - fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) - catBind := &model.StoreSkuCategoryMap{} - catBind.ID = bindID - dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, catBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask) - } - } - if (opType == AmendPruneOnlyPrune || opType == AmendPruneAll) && len(cat2Delete) > 0 { for i := 0; i < 2; i++ { level := 2 - i @@ -698,7 +705,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v } } if len(levelCat2Delete) > 0 { - task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除本地不存在的远程分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, + task4Delete := tasksch.NewParallelTask(fmt.Sprintf("删除商家分类,level:%d", level), tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { cat := batchItemList[0].(*partner.BareCategoryInfo) err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, cat.VendorCatID, level) @@ -724,55 +731,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v // 把京西有,平台无且没有待创建标记的商品加上待创建标记 func AddCreateFlagForJxStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { - return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyAmend) - // handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) - // if handler == nil { - // return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) - // } - // db := dao.GetDB() - - // var storeSkuBindIDs []int - // seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - // switch step { - // case 0: - // localSkuList, err2 := dao.GetStoreSkus2(db, vendorID, storeID, nil, false) - // if err = err2; err != nil { - // return nil, err - // } - // remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) - // if err = err2; err == nil { - // remoteSkuMap := make(map[int]int) - // for _, value := range remoteSkuList { - // for _, skuInfo := range value.SkuList { - // remoteSkuMap[skuInfo.SkuID] = 1 - // } - // } - // for _, v := range localSkuList { - // if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 { - // storeSkuBindIDs = append(storeSkuBindIDs, v.BindID) - // } - // } - // } - // case 1: - // if len(storeSkuBindIDs) > 0 { - // for _, bindID := range storeSkuBindIDs { - // fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) - // skuBind := &model.StoreSkuBind{} - // skuBind.ID = bindID - // dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask) - // } - // } - // } - // return nil, err - // } - // task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2) - // tasksch.HandleTask(task, parentTask, true).Run() - // if isAsync { - // hint = task.GetID() - // } else { - // _, err = task.GetResult(0) - // } - // return hint, err + return amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmendPruneOnlyAmend, false) } func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { From fc7a3ee54ecbc29838b999460327a690c979bc9a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 18:03:03 +0800 Subject: [PATCH 16/50] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=A8?= =?UTF-8?q?=E5=BA=97=E6=97=B6=EF=BC=8C=E4=B8=8D=E5=AE=8C=E5=85=A8=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=95=86=E5=93=81=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=B7=AE?= =?UTF-8?q?=E5=88=86=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 51 ++++++++++++-------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index da3aa113e..1e8a31b88 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -163,7 +163,8 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo switch step { case 0: if singleStoreHandler != nil { - _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError) + // _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError) + _, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, true) } else { _, err = dao.SetStoreSkuSyncStatus(dao.GetDB(), vendorID, []int{storeID}, nil, model.SyncFlagStoreSkuOnlyMask) } @@ -599,7 +600,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v var sku2Delete []*partner.StoreSkuInfo var cat2Delete []*partner.BareCategoryInfo - task := tasksch.NewParallelTask(fmt.Sprintf("修补平台:%s上的门店商品与分类", model.VendorChineseNames[vendorID]), + task := tasksch.NewParallelTask(fmt.Sprintf("修补门店:%d,平台:%s上的商品与商家分类", storeID, model.VendorChineseNames[vendorID]), tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) @@ -721,10 +722,11 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v return nil, err }, []int{0, 1, 2, 3}) tasksch.HandleTask(task, parentTask, true).Run() - if isAsync { - hint = task.GetID() - } else { + if !isAsync { _, err = task.GetResult(0) + hint = "1" + } else { + hint = task.ID } return hint, err } @@ -743,35 +745,30 @@ func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.I } db := dao.GetDB() - var errDeleteSku error - rootTask := tasksch.NewSeqTask(fmt.Sprintf("ClearRemoteStoreStuffAndSetNew:%s", model.VendorChineseNames[vendorID]), ctx, - func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + task := tasksch.NewParallelTask(fmt.Sprintf("删除门店:%d,平台:%s上的商品与商家分类", storeID, model.VendorChineseNames[vendorID]), + tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) switch step { case 0: - err = handler.DeleteStoreAllSkus(ctx, rootTask, storeID, vendorStoreID, isContinueWhenError) - errDeleteSku = err - // 强制忽略删除SKU错误 - if isContinueWhenError { - err = nil - } - if err == nil { - _, err = dao.SetStoreSkuSyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask) - } + err = handler.DeleteStoreAllSkus(ctx, task, storeID, vendorStoreID, isContinueWhenError) case 1: - if err = handler.DeleteStoreAllCategories(ctx, rootTask, storeID, vendorStoreID, isContinueWhenError); err == nil { - _, err = dao.SetStoreCategorySyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask) - } + _, err = dao.SetStoreSkuSyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask) + case 2: + err = handler.DeleteStoreAllCategories(ctx, task, storeID, vendorStoreID, isContinueWhenError) + case 3: + _, err = dao.SetStoreCategorySyncStatus(db, vendorID, []int{storeID}, nil, model.SyncFlagNewMask) } return nil, err - }, 2) - tasksch.AddChild(parentTask, rootTask).Run() + }, []int{0, 1, 2, 3}) + tasksch.HandleTask(task, parentTask, true).Run() if !isAsync { - _, err = rootTask.GetResult(0) + _, err = task.GetResult(0) + hint = "1" + } else { + hint = task.ID } - if err == nil { - err = errDeleteSku - } - return rootTask.ID, err + return hint, err } func GetSensitiveWord(singleStoreHandler partner.ISingleStoreStoreSkuHandler, str string) string { From 27b4fa041b910d61b6e9fcd3fcdd0c51dbddc6c4 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 18:11:05 +0800 Subject: [PATCH 17/50] up --- business/jxstore/cms/sync_store_sku.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 1e8a31b88..ed53f3799 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -640,8 +640,8 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v if !model.IsSyncStatusNew(v.StoreSkuSyncStatus) { syncStatus = model.SyncFlagNewMask } - } else if isForceUpdate && !model.IsSyncStatusUpdate(v.StoreSkuSyncStatus) { - syncStatus = model.SyncFlagModifiedMask + } else if isForceUpdate { + syncStatus = model.SyncFlagStoreSkuModifiedMask } if syncStatus != 0 { skuBind := &model.StoreSkuBind{} From cf89a98a6f6f79a43d36825336c3ed2a5c9a8a96 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 24 Oct 2019 18:38:48 +0800 Subject: [PATCH 18/50] =?UTF-8?q?amendAndPruneStoreStuff=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5VendorSkuID=E6=9D=A5=E5=81=9A=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=88=E5=8E=9F=E6=9D=A5=E6=98=AF=E7=94=A8=E7=9A=84SkuID?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index ed53f3799..550e64cd0 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -610,24 +610,24 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v if err != nil { return nil, err } - localSkuMap := make(map[int]*dao.StoreSkuSyncInfo) + localSkuMap := make(map[string]*dao.StoreSkuSyncInfo) for _, v := range localSkuList { - localSkuMap[v.SkuID] = v + localSkuMap[v.VendorSkuID] = v } remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) if err = err2; err == nil { - remoteSkuMap := make(map[int]int) + remoteSkuMap := make(map[string]int) for _, v := range remoteSkuList { - if skuID := v.SkuList[0].SkuID; skuID > 0 { - if localSkuMap[skuID] == nil || - remoteSkuMap[skuID] == 1 /*skuID在平台重复,典型的是美团可能会出现此类情况*/ { + if vendorSkuID := v.SkuList[0].VendorSkuID; vendorSkuID != "" { + if localSkuMap[vendorSkuID] == nil || + remoteSkuMap[vendorSkuID] == 1 /*skuID在平台重复,典型的是美团可能会出现此类情况*/ { sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{ - SkuID: skuID, - VendorSkuID: v.SkuList[0].VendorSkuID, + SkuID: v.SkuList[0].SkuID, + VendorSkuID: vendorSkuID, }) } else { - remoteSkuMap[skuID] = 1 + remoteSkuMap[vendorSkuID] = 1 } } } @@ -636,7 +636,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v for _, v := range localSkuList { if !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 { syncStatus := 0 - if remoteSkuMap[v.SkuID] == 0 { + if remoteSkuMap[v.VendorSkuID] == 0 { if !model.IsSyncStatusNew(v.StoreSkuSyncStatus) { syncStatus = model.SyncFlagNewMask } From dccc89baa97c8869e862f2963f2fe71479401d58 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 11:30:05 +0800 Subject: [PATCH 19/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A3=8E=E6=8E=A7?= =?UTF-8?q?=E5=8D=95=E5=8F=AF=E8=83=BD=E5=8F=91=E9=80=81=E6=96=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=B6=88=E6=81=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/scheduler/defsch/defsch.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 61edb1eca..7baa08ef5 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -174,12 +174,14 @@ func init() { partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error()) // 为了解决京东新消息与接单消息乱序的问题 if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { - if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status { - order.Status = order2.Status - jxutils.CallMsgHandlerAsync(func() { - sch.OnOrderStatusChanged(order, model.Order2Status(order2), false) - }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) - err = nil + if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil { + if order2.Status > order.Status { + order.Status = order2.Status + jxutils.CallMsgHandlerAsync(func() { + sch.OnOrderStatusChanged(order, model.Order2Status(order2), false) + }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) + err = nil + } } else { err = err2 } From 15a6fa09d4130968145711809f26e1826303bdee Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 11:54:19 +0800 Subject: [PATCH 20/50] =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=8EUnbindAuth?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/auth2/auth2.go | 2 ++ business/auth2/authprovider/defauther.go | 3 +++ 2 files changed, 5 insertions(+) diff --git a/business/auth2/auth2.go b/business/auth2/auth2.go index fc16d22c0..e725d1332 100644 --- a/business/auth2/auth2.go +++ b/business/auth2/auth2.go @@ -288,6 +288,7 @@ func BindUser(inauthInfo *AuthInfo, user IUser) (outauthInfo *AuthInfo, err erro // 添加新绑定 func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) { + globals.SugarLogger.Debugf("AddAuthBind user:%s, newAuthInfo:%s", utils.Format4Output(user, true), utils.Format4Output(newAuthInfo, true)) if user == nil || newAuthInfo == nil { return ErrInternalErrror } @@ -312,6 +313,7 @@ func AddAuthBind(user IUser, newAuthInfo *AuthInfo) (err error) { } func UnbindAuth(userID, authType, userName string) (err error) { + globals.SugarLogger.Debugf("UnbindAuth userID:%s, authType:%s, userName:%s", userID, authType, userName) if handler := authers[authType]; handler != nil { err = handler.UnbindAuth(userID, authType, userName) } else { diff --git a/business/auth2/authprovider/defauther.go b/business/auth2/authprovider/defauther.go index fd6b056f2..2ec2af80b 100644 --- a/business/auth2/authprovider/defauther.go +++ b/business/auth2/authprovider/defauther.go @@ -36,6 +36,7 @@ func (a *DefAuther) AddAuthBind(authBindEx *auth2.AuthBindEx, userName string) ( } func (a *DefAuther) UnbindAuth(userID, authType, userName string) (err error) { + globals.SugarLogger.Debugf("DefAuther.UnbindAuth userID:%s, authType:%s, userName:%s", userID, authType, userName) _, err = dao.DeleteEntityLogically(nil, &model.AuthBind{}, nil, userName, map[string]interface{}{ "UserID": userID, "Type": authType, @@ -59,6 +60,8 @@ func (a *DefAuther) GetUserType() (userType int8) { // 此函数用于联合(通过unionID)查找用户 func (a *DefAuther) UnionFindAuthBind(curAuthType string, unionAuthTypeList []string, openID, unionID string, authDetail interface{}) (authBindEx *auth2.AuthBindEx, err error) { + globals.SugarLogger.Debugf("UnionFindAuthBind curAuthType:%s, unionAuthTypeList:%v, openID:%s, unionID:%s, authDetail:%s", + curAuthType, unionAuthTypeList, openID, unionID, utils.Format4Output(authDetail, true)) db := dao.GetDB() var authBind *model.AuthBind if authBind, err = dao.GetAuthBind(db, model.AuthBindTypeAuth, curAuthType, openID); err == nil { // 直接找到了 From d4dd3331179217c255b0c8ae6747901fdeb09348 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 14:00:52 +0800 Subject: [PATCH 21/50] =?UTF-8?q?=E6=94=B9InitVendorCategory=E4=B8=BA?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BC=82=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/initdata/initdata.go | 74 ++++++++++++++++----------- controllers/init_data.go | 3 +- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index 0f4da6137..2d1046eb2 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -243,42 +243,58 @@ func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError b return hint, err } -func InitVendorCategory(ctx *jxcontext.Context, vendorID int) (num int64, err error) { +func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) { if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil { - cats, err2 := handler.GetVendorCategories(ctx) - if err2 != nil { - return num, err2 - } - db := dao.GetDB() - dao.Begin(db) - defer func() { - if r := recover(); r != nil || err != nil { - dao.Rollback(db) - if r != nil { - panic(r) + var cats []*model.SkuVendorCategory + rootTask := tasksch.NewSeqTask(fmt.Sprintf("创建%s的平台分类", model.VendorChineseNames[vendorID]), ctx, + func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + cats, err = handler.GetVendorCategories(ctx) + if err != nil { + return nil, err + } + case 1: + db := dao.GetDB() + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + sql := ` + DELETE + FROM sku_vendor_category + WHERE vendor_id = ? + ` + if _, err = dao.ExecuteSQL(db, sql, vendorID); err != nil { + return nil, err + } + for _, cat := range cats { + dao.WrapAddIDCULEntity(cat, ctx.GetUserName()) + if err = dao.CreateEntity(db, cat); err != nil { + return nil, err + } + } + dao.Commit(db) } + return nil, err + }, 2) + tasksch.HandleTask(rootTask, nil, true).Run() + if !isAsync { + if _, err = rootTask.GetResult(0); err == nil { + hint = utils.Int2Str(len(cats)) } - }() - sql := ` - DELETE - FROM sku_vendor_category - WHERE vendor_id = ? - ` - if _, err = dao.ExecuteSQL(db, sql, vendorID); err != nil { - return num, err + } else { + hint = rootTask.ID } - for _, cat := range cats { - dao.WrapAddIDCULEntity(cat, ctx.GetUserName()) - if err = dao.CreateEntity(db, cat); err != nil { - return num, err - } - } - dao.Commit(db) - num = int64(len(cats)) } else { err = fmt.Errorf("找不到平台:%d", vendorID) } - return num, err + return hint, err } func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { diff --git a/controllers/init_data.go b/controllers/init_data.go index ae03dfe8d..0226244c3 100644 --- a/controllers/init_data.go +++ b/controllers/init_data.go @@ -42,12 +42,13 @@ func (c *InitDataController) InitSkuName() { // @Description 初始化vendor category(当前只有美团外卖的通过这个设置) // @Param token header string true "认证token" // @Param vendorID formData int true "厂商ID" +// @Param isAsync formData bool false "是否异步操作" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /InitVendorCategory [post] func (c *InitDataController) InitVendorCategory() { c.callInitVendorCategory(func(params *tInitdataInitVendorCategoryParams) (retVal interface{}, errCode string, err error) { - retVal, err = initdata.InitVendorCategory(params.Ctx, params.VendorID) + retVal, err = initdata.InitVendorCategory(params.Ctx, params.VendorID, params.IsAsync) return retVal, "", err }) } From a878c8b0461073e1c79e7797264e943fc9d901c0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 15:37:26 +0800 Subject: [PATCH 22/50] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A5=BF=E7=99=BE?= =?UTF-8?q?=E7=9A=84=E9=BB=98=E8=AE=A4=E5=B9=B3=E5=8F=B0=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/ebai/store_sku2.go | 21 +++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index f9d99cba1..f7f304564 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -17,12 +17,11 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) +const ( + defVendorCatID = 201222934 // 其他蔬菜 +) + var ( - defCatMap = map[int]int64{ - 1: 151301831158987, // 休闲食品 - 2: 15347484581335, // 蔬菜类 - 3: 15347484581339, // 其他蔬菜类休闲食品 - } sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`) ) @@ -252,11 +251,9 @@ func genSkuParamsFromStoreSkuInfo2(storeSku *dao.StoreSkuSyncInfo, isCreate bool "left_num": model.MaxStoreSkuStockQty, "category_id": utils.Str2Int64(storeSku.VendorCatID), "predict_cat": 0, // 不使用推荐类目 - // "cat1_id": getEbaiCat(storeSku.VendorVendorCatID3, 1), - // "cat2_id": getEbaiCat(storeSku.VendorVendorCatID2, 2), - "cat3_id": getEbaiCat(storeSku.VendorVendorCatID, 3), - "weight": storeSku.Weight, - "photos": photos, + "cat3_id": getEbaiCat(storeSku.VendorVendorCatID), + "weight": storeSku.Weight, + "photos": photos, } if storeSku.DescImg != "" { params["rtf"] = storeSku.DescImg @@ -292,9 +289,9 @@ func jxSkuStatus2Ebai(status int) int { return ebaiapi.SkuStatusOnline } -func getEbaiCat(catID int64, level int) int64 { +func getEbaiCat(catID int64) int64 { if catID == 0 { - return defCatMap[level] + return defVendorCatID } return catID } From bc2841a1fcbfd94467ad7a5629fa4fb7ceba7802 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 16:32:41 +0800 Subject: [PATCH 23/50] =?UTF-8?q?CheckSkuDiffBetweenJxAndVendor=E4=B8=AD?= =?UTF-8?q?=E5=8F=96=E5=B9=B3=E5=8F=B0=E6=95=B0=E6=8D=AE=E5=87=BA=E9=94=99?= =?UTF-8?q?=E4=B8=8D=E6=8A=A5=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku_check.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 7af18787a..3cce02e21 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -342,7 +342,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, allSkuInfoList := GetMultiStoreAllSkuInfoList(vendorID) skuBareInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, task, storeID, vendorStoreID, allSkuInfoList) if err != nil { - baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err) + baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err) } else if len(skuBareInfoList) > 0 { filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, skuBareInfoList) CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterSkuInfoMap) @@ -351,7 +351,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) if err != nil { - baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err) + baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err) } else if len(vendorSkuInfoList) > 0 { filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterVendorSkuInfoMap) From b9bbe1d375ca3b22e57f7f591c153cf353765f49 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 17:51:35 +0800 Subject: [PATCH 24/50] =?UTF-8?q?mtwm=E7=9A=84RetailSellStatus=E4=B8=8D?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E4=BC=A0=E9=80=92Skus=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/mtwm/store_sku2.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 7eb233e51..1aa7f132f 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -306,6 +306,8 @@ func storeSku2Mtwm(storeSkuList []*partner.StoreSkuInfo, updateType int) (skuLis skuInfo.Skus[0].Stock = stockCount2Mtwm(storeSku.Stock) } else if updateType == updateTypePrice { skuInfo.Skus[0].Price = jxutils.IntPrice2StandardString(storeSku.VendorPrice) + } else { + skuInfo.Skus = nil } skuList = append(skuList, skuInfo) } From d4f36e0615800dc4f8991beb6b2b73e954a9fe0a Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 18:32:40 +0800 Subject: [PATCH 25/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8DisPossibleSwitch2SelfDe?= =?UTF-8?q?livery=E4=B8=AD=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/scheduler/defsch/defsch_ext.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 47be0dbae..1fb18b3ad 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -94,9 +94,10 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) { if order.Status < model.OrderStatusFinishedPickup { err = fmt.Errorf("拣货完成后才能转自配送") - } else if order.Status == model.OrderStatusFinishedPickup && - time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { - err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) + } else if order.Status == model.OrderStatusFinishedPickup { + if time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { + err = fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) + } } else if order.Status >= model.OrderStatusDelivering && order.Status < model.OrderStatusEndBegin { if model.IsOrderHaveOwnWaybill(order) { err = fmt.Errorf("%s物流已在配送中,不能转自配送", jxutils.GetVendorName(order.VendorID)) From d913825268179a0c0f472251883158773e6da7ab Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 25 Oct 2019 18:50:01 +0800 Subject: [PATCH 26/50] fk --- business/jxcallback/scheduler/defsch/defsch_ext.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 1fb18b3ad..416820c54 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -102,7 +102,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e if model.IsOrderHaveOwnWaybill(order) { err = fmt.Errorf("%s物流已在配送中,不能转自配送", jxutils.GetVendorName(order.VendorID)) } - } else { + } else if order.Status >= model.OrderStatusEndBegin { err = fmt.Errorf("订单%s已经结束,请刷新状态", order.VendorOrderID) } } From e0395feb1df929cae91da7d2e56923e9ef38b94b Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 27 Oct 2019 18:40:35 +0800 Subject: [PATCH 27/50] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E7=BE=8E=E5=9B=A2?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E6=97=B6=EF=BC=8C=E8=AE=B0=E5=BD=95=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E9=97=B4=E4=BB=A5=E8=B7=9F=E8=B8=AA=E7=BE=8E?= =?UTF-8?q?=E5=9B=A2=E2=80=9C=E5=88=9B=E5=BB=BA=E5=95=86=E5=93=81=E6=97=B6?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C=E4=B8=94?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=88=86=E7=B1=BB=E5=90=8D=E7=A7=B0=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=EF=BC=8C=E6=97=A0=E6=B3=95=E8=87=AA=E5=8A=A8=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=88=86=E7=B1=BB=E2=80=9D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 4 ++++ business/model/dao/store_sku.go | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 550e64cd0..ee3711d46 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -97,6 +97,10 @@ func SyncStorCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor } if err == nil { updateFields = append(updateFields, idFieldName) + if vendorID == model.VendorIDMTWM { + storeCatMap.LastOperator = utils.Time2Str(time.Now()) + updateFields = append(updateFields, model.FieldLastOperator) + } } } else if model.IsSyncStatusUpdate(catInfo.StoreCatSyncStatus) { // 修改 if err = handler.UpdateStoreCategory(ctx, storeID, vendorStoreID, catInfo); err == nil { diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index bfcd21adc..c83416d25 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -164,7 +164,7 @@ func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int // 单门店模式厂商适用 // 单纯的从已经创建的store_sku_category_map中,得到相关的同步信息 -func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, isDirty bool) (cats []*SkuStoreCatInfo, err error) { +func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) { fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID]) sql := ` SELECT t4.*, @@ -183,7 +183,7 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, level int, isDirty boo storeID, utils.DefaultTimeValue, } - if isDirty { + if mustDirty { sql += " AND t5.%s_sync_status <> 0" fieldPrefixParams = append(fieldPrefixParams, fieldPrefix) } @@ -204,7 +204,7 @@ func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats // 以store_sku_bind为基础来做同步,正常情况下使用 // !!! 此函数不要将store_sku_bind中的vendor_price取出来放到StoreSkuSyncInfo.VendorPrice中,因为之后会依赖这个VendorPrice进行重算 // 单多门店模式厂商通用 -func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) (skus []*StoreSkuSyncInfo, err error) { +func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) { if vendorID < 0 { panic("vendorID<0") } @@ -275,7 +275,7 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, isDirty bool) sql += " AND t1.store_id = ?" sqlParams = append(sqlParams, storeID) } - if isDirty { + if mustDirty { sql += " AND (t1.%s_sync_status <> 0 OR (%s.%s_id <> 0 AND t3.id IS NULL))" fmtParams = append(fmtParams, fieldPrefix, tableName, fieldPrefix) } else { From 8154d131f747add9406ebf4f9aa439e1280788bf Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 27 Oct 2019 23:00:51 +0800 Subject: [PATCH 28/50] =?UTF-8?q?checkRemoteCatExist=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E5=8F=AA=E6=A0=B9=E6=8D=AEcode=E6=9D=A5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index ee3711d46..24b9a9670 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -576,9 +576,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, isFull bo func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string]*dao.SkuStoreCatInfo, remoteCatList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) { for _, v := range remoteCatList { localCat := localCatMap[v.VendorCatID] - if localCat == nil { - localCat = localCatMap[v.Name] - } + // if localCat == nil { + // localCat = localCatMap[v.Name] + // } if localCat == nil || v.Level != int(localCat.Level) { cat2Delete = append(cat2Delete, v) } else { From 349bb45095d1c4cd764779682fa9dbc9342f1bd1 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 28 Oct 2019 11:14:10 +0800 Subject: [PATCH 29/50] up --- business/model/act.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/model/act.go b/business/model/act.go index 3250d94aa..c644314fd 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -59,7 +59,7 @@ type Act struct { Status int `json:"status"` LimitUser int `json:"limitUser"` // 是否按用户限制 LimitDaily int `json:"limitDaily"` // 每日限购单数 - LimitCount int `json:"limitCount"` // 第单限购数量 + LimitCount int `json:"limitCount"` // 每单限购数量 Source string `orm:"size(255)" json:"source"` CreateType int `json:"createType"` PricePercentage int `json:"pricePercentage"` // 单品级活动才有效 From a2252e64877c1e334311a1173010cb0a04287814 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 28 Oct 2019 13:44:06 +0800 Subject: [PATCH 30/50] =?UTF-8?q?updateOrderOtherInfo=E4=B8=AD=E4=B8=8D?= =?UTF-8?q?=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86VendorIDJX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 40 ++++++++------------------- business/model/dao/store.go | 16 ++++------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 8f7bee87c..b9dcf5fd7 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -385,37 +385,19 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao globals.SugarLogger.Debugf("updateOrderOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) payPercentage := 0 - if order.VendorID != model.VendorIDJX { - storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID) - if err != nil { - if !dao.IsNoRowsError(err) { - globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) - return err - } - if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour { - globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID]) - } - err = nil - } else { - order.JxStoreID = storeDetail.Store.ID - payPercentage = storeDetail.PayPercentage + storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, order.VendorID) + if err != nil { + if !dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("updateOrderOtherInfo GetStoreDetailByVendorStoreID orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) + return err } + if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour { + globals.SugarLogger.Infof("updateOrderOtherInfo [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID]) + } + err = nil } else { - store := &model.Store{} - store.ID = order.StoreID - if err = dao.GetEntity(dao.GetDB(), store); err != nil { - if !dao.IsNoRowsError(err) { - globals.SugarLogger.Warnf("updateOrderOtherInfo GetEntity orderID:%s, VendorStoreID:%s, error:%v", order.VendorOrderID, order.VendorStoreID, err) - return err - } - if time.Now().Sub(order.OrderCreatedAt) < 1*time.Hour { - globals.SugarLogger.Infof("updateOrderOtherInfo b, [运营]订单在京西与平台都找不到京西门店信息,订单:%s,平台门店ID:%s,平台:%s", order.VendorOrderID, order.VendorStoreID, model.VendorChineseNames[order.VendorID]) - } - err = nil - } else { - payPercentage = store.PayPercentage - } - order.JxStoreID = order.StoreID + order.JxStoreID = storeDetail.Store.ID + payPercentage = storeDetail.PayPercentage } if err = c.updateOrderSkuOtherInfo(order, db, payPercentage); err == nil { jxutils.RefreshOrderSkuRelated(order) diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 7aae7ec61..f6d45fc59 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -101,6 +101,10 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto if err = GetRow(db, storeDetail, sql, sqlParams...); err == nil { storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr) storeDetail.FreightDeductionPackObj = FreightDeductionPack2Obj(storeDetail.FreightDeductionPackStr) + if vendorID == model.VendorIDJX { + storeDetail.VendorStatus = storeDetail.Status + storeDetail.PricePercentage = 100 + } return storeDetail, nil } return nil, err @@ -114,16 +118,8 @@ func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int if vendorID != model.VendorIDJX { return getStoreDetail(db, 0, vendorID, vendorStoreID) } - store := &model.Store{} - store.ID = int(utils.Str2Int64WithDefault(vendorStoreID, 0)) - if err = GetEntity(db, store); err == nil { - // todo 还要补全其它参数 - storeDetail = &StoreDetail{ - Store: *store, - VendorStoreID: vendorStoreID, - VendorStatus: store.Status, - PricePercentage: 100, - } + if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, ""); err == nil { + storeDetail.VendorStoreID = vendorStoreID } return storeDetail, err } From 8281dfb19dc36be7daf6918e92fac693c97ec26a Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 28 Oct 2019 16:19:48 +0800 Subject: [PATCH 31/50] debug CompareJxAndVendor --- business/jxstore/cms/store_sku_check.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 3cce02e21..c41e4f1ff 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -283,14 +283,22 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin } } for skuID, vendorSkuInfo := range filterVendorSkuInfoMap { - skuIDStr := utils.Int2Str(skuID) - vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName - vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status) + if vendorSkuInfo != nil { + if len(vendorSkuInfo.SkuList) > 0 { + skuIDStr := utils.Int2Str(skuID) + vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName + vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status) - jxSkuInfo := filterJxSkuInfoMap[skuID] - if jxSkuInfo == nil { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName} - diffData.AppendData(vendorID, outPutData) + jxSkuInfo := filterJxSkuInfoMap[skuID] + if jxSkuInfo == nil { + outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName} + diffData.AppendData(vendorID, outPutData) + } + } else { + globals.SugarLogger.Warnf("CompareJxAndVendor vendorSkuInfo.SkuList:%d is nil", skuID) + } + } else { + globals.SugarLogger.Warnf("CompareJxAndVendor skuID:%d is nil", skuID) } } } From 04e65edebdad352d628fcc2b3bfe6f17276e7455 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 09:42:49 +0800 Subject: [PATCH 32/50] =?UTF-8?q?GetOrders=E5=92=8CGetAfsOrders=E6=94=AF?= =?UTF-8?q?=E6=8C=81Post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/jx_order.go | 4 ++-- routers/commentsRouter_controllers.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/controllers/jx_order.go b/controllers/jx_order.go index b28ab30b9..703b4571c 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -283,7 +283,7 @@ func (c *OrderController) ExportMTWaybills() { // @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult -// @router /GetOrders [get] +// @router /GetOrders [get,post] func (c *OrderController) GetOrders() { c.callGetOrders(func(params *tOrderGetOrdersParams) (retVal interface{}, errCode string, err error) { var skuIDs []int @@ -335,7 +335,7 @@ func (c *OrderController) ExportOrders() { // @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult -// @router /GetAfsOrders [get] +// @router /GetAfsOrders [get,post] func (c *OrderController) GetAfsOrders() { c.callGetAfsOrders(func(params *tOrderGetAfsOrdersParams) (retVal interface{}, errCode string, err error) { timeList, err := jxutils.BatchStr2Time(params.FromTime, params.ToTime) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 9345a8936..157c07787 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -796,7 +796,7 @@ func init() { beego.ControllerComments{ Method: "GetAfsOrders", Router: `/GetAfsOrders`, - AllowHTTPMethods: []string{"get"}, + AllowHTTPMethods: []string{"get","post"}, MethodParams: param.Make(), Filters: nil, Params: nil}) @@ -841,7 +841,7 @@ func init() { beego.ControllerComments{ Method: "GetOrders", Router: `/GetOrders`, - AllowHTTPMethods: []string{"get"}, + AllowHTTPMethods: []string{"get","post"}, MethodParams: param.Make(), Filters: nil, Params: nil}) From 378edfd3c98937badefdc470e483f6cb22f138aa Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 11:38:39 +0800 Subject: [PATCH 33/50] =?UTF-8?q?=E8=85=BE=E8=AE=AF=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/wxpay_callback.go | 26 ++++++++++++++++++++++++++ routers/router.go | 1 + 2 files changed, 27 insertions(+) create mode 100644 controllers/wxpay_callback.go diff --git a/controllers/wxpay_callback.go b/controllers/wxpay_callback.go new file mode 100644 index 000000000..3de328fc0 --- /dev/null +++ b/controllers/wxpay_callback.go @@ -0,0 +1,26 @@ +package controllers + +import ( + "net/http" + + "git.rosy.net.cn/baseapi/platformapi/wxpay" + "github.com/astaxie/beego" +) + +type WXPayController struct { + beego.Controller +} + +func (c *WXPayController) Msg() { + if c.Ctx.Input.Method() == http.MethodPost { + var callbackResponse *wxpay.CallbackResponse + + if callbackResponse == nil { + callbackResponse = wxpay.SuccessResponse + } + c.Data["xml"] = callbackResponse + c.ServeXML() + } else { + c.Abort("404") + } +} diff --git a/routers/router.go b/routers/router.go index 9e0979e45..ab384579f 100644 --- a/routers/router.go +++ b/routers/router.go @@ -133,6 +133,7 @@ func init() { beego.AutoRouter(&controllers.WeimobController{}) beego.AutoRouter(&controllers.WeixinController{}) beego.AutoRouter(&controllers.DingDingController{}) + beego.AutoRouter(&controllers.WXPayController{}) // 如下都是用于检测存活的空接口 beego.Any("/", func(ctx *beecontext.Context) { From 84bd8d0b32a86e318b40488fd879783af330e759 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 17:28:49 +0800 Subject: [PATCH 34/50] =?UTF-8?q?=E4=BC=98=E5=8C=96mtwm.ListOrders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/mtwm/order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 6a8209a0d..271f43d54 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -579,7 +579,7 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. orderIDs = append(orderIDs, utils.Int64ToStr(v)) } } - if err = err2; err != nil || len(tmpOrderIDs) == 0 { + if err = err2; err != nil || len(tmpOrderIDs) < mtwmapi.MaxGap4GetOrderIdByDaySeq { err = nil break } From db1e81902f89a514071edf675039e5dffe8b1c66 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 17:30:49 +0800 Subject: [PATCH 35/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8DGetOrderConsigneeNumber?= =?UTF-8?q?=E4=B8=8EGetOrderCourierNumber=E4=B8=AD=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E4=BD=BF=E7=94=A8offset=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/mtwm/order.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 271f43d54..d27769f5f 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -609,7 +609,7 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { offset := 0 for { - result, err2 := api.MtwmAPI.OrderBatchPullPhoneNumber(vendorStoreID, 0, mtwmapi.MaxBatchPullPhoneNumberLimit) + result, err2 := api.MtwmAPI.OrderBatchPullPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) if err = err2; err == nil { for _, v := range result { v2 := &partner.OrderPhoneNumberInfo{ @@ -635,7 +635,7 @@ func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeI func (p *PurchaseHandler) GetOrderCourierNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { offset := 0 for { - result, err2 := api.MtwmAPI.OrderGetRiderInfoPhoneNumber(vendorStoreID, 0, mtwmapi.MaxBatchPullPhoneNumberLimit) + result, err2 := api.MtwmAPI.OrderGetRiderInfoPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) if err = err2; err == nil { for _, v := range result { numberList = append(numberList, &partner.OrderPhoneNumberInfo{ From bed22236009c0d6150f8f964078f472e1b4bca50 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 17:54:15 +0800 Subject: [PATCH 36/50] =?UTF-8?q?OrderManager.OnOrderStatusChanged?= =?UTF-8?q?=E4=B8=AD=20=E6=9C=89=E4=BA=9B=E5=B9=B3=E5=8F=B0=EF=BC=88?= =?UTF-8?q?=E6=AF=94=E5=A6=82=E7=BE=8E=E5=9B=A2=E5=A4=96=E5=8D=96=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E6=96=B0=E8=AE=A2=E5=8D=95=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=88=90=E5=8A=9F=E8=BF=94=E5=9B=9E=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E5=9C=A8=E9=87=8D=E5=8F=91=E8=AE=A2=E5=8D=95=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=89=8D=EF=BC=8C=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=EF=BC=8C=E5=88=99=E4=B8=8D=E4=BC=9A=E5=86=8D?= =?UTF-8?q?=E9=87=8D=E5=8F=91=E6=96=B0=E8=AE=A2=E5=8D=95=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/order.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index b9dcf5fd7..b1c52f003 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -11,6 +11,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils" "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/globals" "github.com/astaxie/beego/orm" ) @@ -151,6 +152,17 @@ func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, orderStatus *model } func (c *OrderManager) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) { + // 有些平台(比如美团外卖),在新订单事件没有成功返回,但在重发订单消息前,订单状态转换,则不会再重发新订单事件,特殊处理一下 + if orderStatus.Status == model.OrderStatusAccepted { + if _, err2 := c.LoadOrder(orderStatus.VendorOrderID, orderStatus.VendorID); err2 == ErrCanNotFindOrder { + if handler := partner.GetPurchaseOrderHandlerFromVendorID(orderStatus.VendorID); handler != nil { + if order, err2 := handler.GetOrder(orderStatus.VendorOrderID); err2 == nil { + c.OnOrderNew(order, orderStatus) + } + } + } + } + db := dao.GetDB() dao.Begin(db) defer func() { From 086c4199f21369791faebedca4601f5d40c34e50 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 18:25:45 +0800 Subject: [PATCH 37/50] =?UTF-8?q?=E4=BC=98=E5=8C=96mtwm.ListOrders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/mtwm/order.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index d27769f5f..cdf04c24c 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -3,6 +3,7 @@ package mtwm import ( "errors" "fmt" + "math" "net/url" "regexp" "strings" @@ -571,19 +572,29 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. vendorStoreID := batchItemList[0].(string) var orderIDs []string seqStart := 1 + i := 0 for { - seqEnd := seqStart + mtwmapi.MaxGap4GetOrderIdByDaySeq - 1 - tmpOrderIDs, err2 := api.MtwmAPI.GetOrderIdByDaySeq(vendorStoreID, queryDate, seqStart, seqEnd) + batchSize := int(math.Min(math.Pow(2, float64(i)), float64(mtwmapi.MaxGap4GetOrderIdByDaySeq))) + seqEnd := seqStart + batchSize - 1 + var tmpOrderIDs []int64 + if seqStart == seqEnd { + if vendorOderID, err2 := api.MtwmAPI.GetOrderIdByDaySeqSingle(vendorStoreID, queryDate, seqStart); err2 == nil { + tmpOrderIDs = []int64{vendorOderID} + } + } else { + tmpOrderIDs, err = api.MtwmAPI.GetOrderIdByDaySeq(vendorStoreID, queryDate, seqStart, seqEnd) + } if len(tmpOrderIDs) > 0 { for _, v := range tmpOrderIDs { orderIDs = append(orderIDs, utils.Int64ToStr(v)) } } - if err = err2; err != nil || len(tmpOrderIDs) < mtwmapi.MaxGap4GetOrderIdByDaySeq { + if err != nil || len(tmpOrderIDs) < batchSize { err = nil break } seqStart = seqEnd + 1 + i++ } retVal = orderIDs return retVal, nil From 01f77b8c8c3038824a88af4dd4f72b07b64a1385 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 29 Oct 2019 18:40:06 +0800 Subject: [PATCH 38/50] up --- business/partner/purchase/mtwm/order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index cdf04c24c..82ee31b6b 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -574,7 +574,7 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, parentTask tasksch. seqStart := 1 i := 0 for { - batchSize := int(math.Min(math.Pow(2, float64(i)), float64(mtwmapi.MaxGap4GetOrderIdByDaySeq))) + batchSize := int(math.Min(math.Pow(2, float64(i*3)), float64(mtwmapi.MaxGap4GetOrderIdByDaySeq))) seqEnd := seqStart + batchSize - 1 var tmpOrderIDs []int64 if seqStart == seqEnd { From 5fa1fa38a817e5a15c3daf5e66cc3234466fde33 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 08:45:03 +0800 Subject: [PATCH 39/50] =?UTF-8?q?=E7=BE=8E=E5=9B=A2=E5=A4=96=E5=8D=96?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=95=86=E5=93=81=E5=9F=BA=E7=A1=80=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E6=97=B6=EF=BC=8C=E6=94=B9=E7=94=A8=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/mtwm/store_sku2.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 1aa7f132f..a6220d317 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -37,8 +37,10 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { batchSize = mtwmapi.MaxStoreSkuBatchSize case partner.FuncDeleteStoreSkus: batchSize = 1 // 可考虑用批量操作 - case partner.FuncCreateStoreSkus, partner.FuncUpdateStoreSkus: + case partner.FuncCreateStoreSkus: batchSize = 1 // 可考虑用批量操作 + case partner.FuncUpdateStoreSkus: + batchSize = mtwmapi.MaxStoreSkuBatchSize case partner.FuncGetStoreSkusFullInfo: batchSize = 1 } From 069db73f7b73b74fff3246bb9d819658e354911c Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 10:53:10 +0800 Subject: [PATCH 40/50] =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=BE=AE=E7=9B=9Ftoken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 5d61ec564..dfd8d3d20 100644 --- a/main.go +++ b/main.go @@ -122,10 +122,10 @@ func main() { // globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err) // return // } - // if err := tasks.RefreshWeimobToken(); err != nil { - // globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) - // return - // } + if err := tasks.RefreshWeimobToken(); err != nil { + globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) + return + } if err := tasks.RefreshYilianyunToken(); err != nil { globals.SugarLogger.Errorf("RefreshYilianyunToken failed with error:%s", err) return From 1c4bf23561193c62c3d878dcc77e1d42658fd861 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 11:38:34 +0800 Subject: [PATCH 41/50] =?UTF-8?q?prod=E5=90=AF=E7=94=A8=E5=BE=AE=E7=9B=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/app.conf b/conf/app.conf index 362ab482a..2f344db9f 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -155,6 +155,7 @@ enableEbaiStoreWrite = true enableMtwmStoreWrite = true enableWscStoreWrite = true +disableWeimob = false weimobCallbackURL = "http://callback.jxc4.com/weimob" dingdingAgentID = 239461075 From 6d307d9150757ee8e1b2f945376338ed1c0ebefb Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 16:19:26 +0800 Subject: [PATCH 42/50] RefreshYilianyunToken --- business/jxutils/eventhub/eventhub.go | 4 +- .../eventhub/syseventhub/syseventhub.go | 38 ++++- business/jxutils/tasks/configrefresh.go | 161 ++++++++---------- controllers/sys.go | 21 ++- globals/globals.go | 2 + main.go | 4 - routers/commentsRouter_controllers.go | 9 + 7 files changed, 135 insertions(+), 104 deletions(-) diff --git a/business/jxutils/eventhub/eventhub.go b/business/jxutils/eventhub/eventhub.go index 422f3057c..3a4ca25f7 100644 --- a/business/jxutils/eventhub/eventhub.go +++ b/business/jxutils/eventhub/eventhub.go @@ -43,7 +43,6 @@ type EventInfo struct { type tRegisterInfo struct { notifyChan chan *EventInfo - eventCategory string eventTypeList []string criteria interface{} } @@ -177,8 +176,7 @@ func (e *EventHub) registerConsumer(eventCategory string, eventTypeList []string realEventTypeList[index] = composeEventType(eventCategory, eventType) } info := &tRegisterInfo{ - eventCategory: eventCategory, - eventTypeList: eventTypeList, + eventTypeList: realEventTypeList, notifyChan: make(chan *EventInfo, 1), criteria: criteria, } diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 5ef2c63de..6e892522a 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -13,7 +13,8 @@ import ( const ( EventCategory = "sys" - EventTypeWXToken = "wxtoken" + EventTypeWXToken = "wxtoken" + EventTypeYLYToken = "ylytoken" ) type Hub struct { @@ -23,7 +24,7 @@ type Hub struct { type Criteria struct { } -type WXTokenInfo struct { +type TokenInfo struct { IsNew bool `json:"isNew"` Token string `json:"token"` } @@ -55,22 +56,43 @@ func (h *Hub) OnNewWXToken(token string) { }) } -func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *WXTokenInfo) { - token := api.WeixinAPI.CBGetToken() +func (h *Hub) OnNewYLYToken(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypeYLYToken, + Data: token, + }) +} + +func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + var token string + switch tokenType { + case EventTypeWXToken: + token = api.WeixinAPI.CBGetToken() + case EventTypeYLYToken: + token = api.YilianyunAPI.GetToken() + } if token != oldToken { - tokenInfo = &WXTokenInfo{ + tokenInfo = &TokenInfo{ IsNew: false, Token: token, } } else { - eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{EventTypeWXToken}, nil, waitTime) + eventInfo, err := h.eventHub.GetEvent(EventCategory, []string{tokenType}, nil, waitTime) if err == nil && eventInfo != nil { - tokenInfo = &WXTokenInfo{ + tokenInfo = &TokenInfo{ IsNew: true, Token: eventInfo.Data.(string), } } } - globals.SugarLogger.Debugf("GetWXToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + globals.SugarLogger.Debugf("GetToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) return tokenInfo } + +func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeWXToken, oldToken, waitTime) +} + +func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeYLYToken, oldToken, waitTime) +} diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index 7297ddf1d..ce071d76f 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -26,7 +26,6 @@ import ( const ( weixinTokenExpires = 7200 * time.Second dingdingTokenExpires = 7200 * time.Second - elmTokenExpires = 20 * 24 * 3600 * time.Second weimobTokenExpires = 7200 * time.Second yilianyunTokenExpires = 30 * 24 * 3600 * time.Second @@ -35,16 +34,6 @@ const ( minRefreshGap = 1 * time.Second ) -type ElmTokenForCompatible struct { - Error string `json:"error"` - ErrorDescription string `json:"error_description"` - AccessToken string `json:"accessToken"` - TokenType string `json:"tokenType"` - Expires int `json:"expires"` - RefreshToken string `json:"refreshToken"` - Success bool `json:"success"` -} - type CallResult struct { Code string `json:"code"` Desc string `json:"desc"` @@ -151,39 +140,10 @@ func RefreshWeixinToken() (err error) { return err } -func RefreshElmToken() (err error) { - if api.ElmAPI != nil { - err = RefreshConfig("eleme", elmTokenExpires, func() (string, string) { - if globals.IsProductEnv() { - if tokenInfo, err := api.ElmAPI.RefreshTokenIndividual(); err == nil { - tokenInfo2 := &ElmTokenForCompatible{ - Error: "", - ErrorDescription: "", - AccessToken: tokenInfo.AccessToken, - TokenType: tokenInfo.TokenType, - Expires: tokenInfo.ExpiresIn, - RefreshToken: "", - Success: true, - } - return string(utils.MustMarshal(tokenInfo2)), "" - } - } - return "", "" - }, func(value string) { - var tokenInfo ElmTokenForCompatible - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.ElmAPI.SetToken(tokenInfo.AccessToken) - } - }) - } - return err -} - func RefreshWeimobToken() (err error) { if api.WeimobAPI != nil { err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) { - if globals.IsProductEnv() { + if globals.IsMainProductEnv() { if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) } @@ -230,62 +190,37 @@ func SaveWeimobToken(token *weimobapi.TokenInfo) (err error) { } func RefreshYilianyunToken() (err error) { - return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (string, string) { + return RefreshConfig("yilianyun", yilianyunTokenExpires, func() (token string, expireTimeStr string) { globals.SugarLogger.Debugf("RefreshYilianyunToken RunMode:%s", beego.BConfig.RunMode) - if globals.IsProductEnv() { - if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key - if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil { - return string(utils.MustMarshal(tokenInfo)), "" - } else { - globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err) - } + if globals.IsMainProductEnv() { // 只有京西菜市刷新易联云key + if tokenInfo, err := api.YilianyunAPI.RetrieveToken(); err == nil { + token = string(utils.MustMarshal(tokenInfo)) + } else { + globals.SugarLogger.Errorf("RefreshYilianyunToken RefreshToken failed with error:%v", err) + } + } else { + if tokenInfo := getYLYTokenFromRemote(api.YilianyunAPI.GetToken()); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-yilianyunTokenExpires)) + token = tokenInfo.Token } } - return "", "" + return token, expireTimeStr }, func(value string) { + token := value var tokenInfo *yilianyunapi.TokenInfo - err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) - if err == nil { - api.YilianyunAPI.SetToken(tokenInfo.AccessToken) + if err := utils.TryUnmarshalUseNumber([]byte(value), &tokenInfo); err == nil { + token = tokenInfo.AccessToken } + syseventhub.SysEventHub.OnNewYLYToken(token) + api.YilianyunAPI.SetToken(token) }) } -func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) { +func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { if IsGetWXTokenFromRemote() { - for { - waitSecond := 5 * 60 - globals.SugarLogger.Debugf("getWXTokenFromProd1") - response, err := http.Get(fmt.Sprintf("%s?accessKey=%s&oldToken=%s&waitSecond=%d", globals.GetWeixinTokenURL, globals.GetWeixinTokenKey, oldToken, waitSecond)) - globals.SugarLogger.Debugf("getWXTokenFromProd2 error:%v", err) - if err == nil { - defer response.Body.Close() - if response.StatusCode == http.StatusOK { - data, err2 := ioutil.ReadAll(response.Body) - if err = err2; err == nil { - var result CallResult - if err = utils.UnmarshalUseNumber(data, &result); err == nil { - if result.Code == "0" { - if result.Data != "" { - if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { - globals.SugarLogger.Debugf("getWXTokenFromProd:%s", utils.Format4Output(tokenInfo, false)) - break - } - } - } else { - err = fmt.Errorf("return code is:%s", result.Code) - } - } - } - } else { - err = platformapi.ErrHTTPCodeIsNot200 - } - } - globals.SugarLogger.Infof("getWXTokenFromProd failed with error:%v", err) - if err != nil { - time.Sleep(errRefreshGap) - } - } + tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) } return tokenInfo } @@ -293,3 +228,55 @@ func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.WXTokenInfo) func IsGetWXTokenFromRemote() bool { return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" } + +func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]interface{}) (tokenInfo *syseventhub.TokenInfo) { + if waitSecond == 0 { + waitSecond = 5 * 60 + } + params2 := utils.MergeMaps(params, map[string]interface{}{ + "accessKey": globals.GetWeixinTokenKey, + "waitSecond": waitSecond, + }) + for { + globals.SugarLogger.Debugf("PollingRemotEvent") + response, err := http.Get(utils.GenerateGetURL(remoteURL, "", params2)) + globals.SugarLogger.Debugf("PollingRemotEvent2 error:%v", err) + if err == nil { + defer response.Body.Close() + if response.StatusCode == http.StatusOK { + data, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + var result CallResult + if err = utils.UnmarshalUseNumber(data, &result); err == nil { + if result.Code == "0" { + if result.Data != "" { + if err = utils.UnmarshalUseNumber([]byte(result.Data), &tokenInfo); err == nil && tokenInfo != nil { + globals.SugarLogger.Debugf("PollingRemotEvent %s:%s", remoteURL, utils.Format4Output(tokenInfo, false)) + break + } + } + } else { + err = fmt.Errorf("return code is:%s", result.Code) + } + } + } + } else { + err = platformapi.ErrHTTPCodeIsNot200 + } + } + globals.SugarLogger.Infof("PollingRemotEvent failed with error:%v", err) + if err != nil { + time.Sleep(errRefreshGap) + } + } + return tokenInfo +} + +func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} diff --git a/controllers/sys.go b/controllers/sys.go index 96d67fdc6..26ad57cce 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -20,8 +20,8 @@ type SysController struct { beego.Controller } -// @Title 得到京西门店信息 -// @Description 得到京西门店信息,如下条件之间是与的关系 +// @Title 得到微信token +// @Description 得到微信token // @Param accessKey query string true "假token" // @Param oldToken query string false "之前的token" // @Param waitSecond query int false "等待秒数" @@ -37,6 +37,23 @@ func (c *SysController) GetWXToken() { }) } +// @Title 得到易联云token +// @Description 得到易联云token +// @Param accessKey query string true "假token" +// @Param oldToken query string false "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetYLYToken [get] +func (c *SysController) GetYLYToken() { + c.callGetYLYToken(func(params *tSysGetYLYTokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetYLYToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} + // @Title 得到饿百RTF转换内容 // @Description 得到饿百RTF转换内容 // @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的" diff --git a/globals/globals.go b/globals/globals.go index bb99b38ca..3bd30d243 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -40,6 +40,7 @@ var ( GetWeixinTokenURL string GetWeixinTokenKey string + GetYLYTokenURL string StoreName string @@ -82,6 +83,7 @@ func Init() { WxBackstageHost = beego.AppConfig.DefaultString("wxBackstageHost", "") GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "") + GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "") GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市") diff --git a/main.go b/main.go index dfd8d3d20..4088c347f 100644 --- a/main.go +++ b/main.go @@ -118,10 +118,6 @@ func main() { globals.SugarLogger.Errorf("RefreshWeixinToken failed with error:%s", err) return } - // if err := tasks.RefreshElmToken(); err != nil { - // globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err) - // return - // } if err := tasks.RefreshWeimobToken(); err != nil { globals.SugarLogger.Errorf("RefreshWeimobToken failed with error:%s", err) return diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 157c07787..6cec894c6 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1647,6 +1647,15 @@ func init() { 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: "GetYLYToken", + Router: `/GetYLYToken`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TaskController"], beego.ControllerComments{ Method: "CancelTask", From 07d374a02e9c02688bd606db963c48779ea810e8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 16:35:05 +0800 Subject: [PATCH 43/50] =?UTF-8?q?=E6=9E=9C=E5=9B=AD=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96=E6=98=93=E8=81=94=E4=BA=91key=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/tasks/configrefresh.go | 8 ++++---- conf/app.conf | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index ce071d76f..d675a6919 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -238,9 +238,9 @@ func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]inter "waitSecond": waitSecond, }) for { - globals.SugarLogger.Debugf("PollingRemotEvent") + globals.SugarLogger.Debugf("PollingRemotEvent %s", remoteURL) response, err := http.Get(utils.GenerateGetURL(remoteURL, "", params2)) - globals.SugarLogger.Debugf("PollingRemotEvent2 error:%v", err) + globals.SugarLogger.Debugf("PollingRemotEvent2 %s error:%v", remoteURL, err) if err == nil { defer response.Body.Close() if response.StatusCode == http.StatusOK { @@ -256,7 +256,7 @@ func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]inter } } } else { - err = fmt.Errorf("return code is:%s", result.Code) + err = fmt.Errorf("PollingRemotEvent %s return code is:%s", remoteURL, result.Code) } } } @@ -264,7 +264,7 @@ func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]inter err = platformapi.ErrHTTPCodeIsNot200 } } - globals.SugarLogger.Infof("PollingRemotEvent failed with error:%v", err) + globals.SugarLogger.Infof("PollingRemotEvent %s failed with error:%v", remoteURL, err) if err != nil { time.Sleep(errRefreshGap) } diff --git a/conf/app.conf b/conf/app.conf index 2f344db9f..c5a5e8de9 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -119,6 +119,7 @@ weixinToken = "17_roSCZgkCxhRnyFVtei0KdfHwdGP8PmLzJFhCieka4_X4_d-lgfaTxF6oIS6FE5 dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" getWeixinTokenURL = "http://beta.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://beta.jxc4.com/v2/sys/GetYLYToken" [prod] EnableDocs = false @@ -215,6 +216,8 @@ dingdingQRCodeSecret = "N9dyC9qB84sauQPs4_JYrILMsG5Krqm9-PSSVJ8t9hb87rrHiFUirISx dingdingCallbackURL = "http://callback-jxgy.jxc4.com/dingding/msg" getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" + storeName = "京西果园" [test] From fd9b2972cec4bfe91b442761a412dde7048d65ed Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 16:39:43 +0800 Subject: [PATCH 44/50] =?UTF-8?q?GetOrderSkuInfo=E4=B8=AD=E8=BF=94?= =?UTF-8?q?=E5=9B=9EnameID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/orderman_ext.go | 25 ++++++++++---------- business/model/api.go | 1 + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index ad5aca131..cc7eb3abf 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -96,7 +96,7 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price, t1.sale_price, t1.earning_price, - CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) real_earning_price, + CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, ?) / 100) AS SIGNED) real_earning_price, t1.weight, t1.sku_type, t1.promotion_type, @@ -105,18 +105,17 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str t1.store_sub_name, t1.vendor_price, %s full_sku_name, - `, model.DefaultEarningPricePercentage, fullSkuNameSQL) - db := dao.GetDB() - err = dao.GetRows(db, &skus, sql+` - t3.img image - FROM order_sku t1 - LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id - LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) - LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ - LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ - WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? - ORDER BY t1.sku_name - `, /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/ vendorOrderID, vendorID) + t2.name_id, + t3.img image + FROM order_sku t1 + LEFT JOIN goods_order t6 ON t6.vendor_order_id = t1.vendor_order_id AND t6.vendor_id = t1.vendor_id + LEFT JOIN store t5 ON t5.id = IF(t6.jx_store_id <> 0, t6.jx_store_id, t6.store_id) + LEFT JOIN sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id/* AND t2.deleted_at = ?*/ + LEFT JOIN sku_name t3 ON t2.name_id = t3.id/* AND t3.deleted_at = ?*/ + WHERE t1.vendor_order_id = ? AND t1.vendor_id = ? + ORDER BY t1.sku_name + `, fullSkuNameSQL) + err = dao.GetRows(dao.GetDB(), &skus, sql /*, utils.DefaultTimeValue, utils.DefaultTimeValue*/, model.DefaultEarningPricePercentage, vendorOrderID, vendorID) if err != nil { globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) return nil, err diff --git a/business/model/api.go b/business/model/api.go index 1a3396774..e6c6a6796 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -36,6 +36,7 @@ type GoodsOrderExt struct { type OrderSkuExt struct { OrderSku + NameID int `orm:"column(name_id)" json:"nameID"` FullSkuName string `json:"fullSkuName"` Image string `json:"image"` RealEarningPrice int64 `json:"realEarningPrice"` // 实际单品结算给门店老板钱 From 3bd84cff45115af5f3dc2aa6ea48e66d81d85af4 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 17:35:35 +0800 Subject: [PATCH 45/50] =?UTF-8?q?SyncSkus=E4=B8=AD=E7=9A=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=AD=96=E7=95=A5=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 22f9b97f0..d7d03b007 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -232,7 +232,7 @@ func (v *VendorSync) SyncSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuI func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []int, skuIDs []int, isAsync, isContinueWhenError bool, userName string) (hint string, err error) { globals.SugarLogger.Debugf("SyncSku trackInfo:%s, nameIDs:%v, skuIDs:%v, userName:%s", ctx.GetTrackInfo(), nameIDs, skuIDs, userName) - isManagedIt := len(nameIDs) > 1 || len(nameIDs) == 0 || len(skuIDs) > 1 || len(skuIDs) == 0 + isManagedIt := !(len(nameIDs) > 0 && len(nameIDs) <= 2 || len(skuIDs) > 0 && len(skuIDs) < 8) return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { var resultList []interface{} From 48d6d5487bb85877486e18e56c3e571aa5c9b9a1 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 30 Oct 2019 18:00:35 +0800 Subject: [PATCH 46/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8DGetPossibleVendorIDFrom?= =?UTF-8?q?VendorOrderID=E4=B8=AD=E8=AF=AF=E5=88=A4=E6=96=AD=E4=BA=AC?= =?UTF-8?q?=E4=B8=9C=E6=96=B0=E8=AE=A2=E5=8D=95=E5=8F=B7=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/jxutils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 763b78730..549df3cda 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -144,7 +144,7 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) { // 改造点: // 1、订单号位数变化,由原有15位数增加1位数调整为16位数,对接商家需检查是否有对订单号位数做长度校验。 // 2、第一位数字发生变化,由原来9开头调整为当年年份后两位数如:2020年订单开头为20; - if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541")+1 { + if orderIDLen == len("925265130002541") || orderIDLen == len("1925265130002541") { vendorID = model.VendorIDJD } else if orderIDLen == len("3022716176275221584") { // vendorID = model.VendorIDELM From bd0694ca32baaa270328ed3d015b32981e0b261a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 31 Oct 2019 09:30:37 +0800 Subject: [PATCH 47/50] =?UTF-8?q?=E6=AF=8F=E6=99=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=B6=EF=BC=8C=E6=8E=92=E9=99=A4=E7=A6=81?= =?UTF-8?q?=E7=94=A8=E9=97=A8=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 50 ++++++++++------------------------- business/jxstore/misc/misc.go | 6 ++--- controllers/cms_sync.go | 2 +- 3 files changed, 18 insertions(+), 40 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index d7d03b007..750931e3e 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -358,7 +358,7 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v } // -func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) { +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 task, hint, err := v.LoopStoresMap2(ctx, db, fmt.Sprintf("同步门店商品信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, @@ -373,11 +373,13 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vend tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeMap := batchItemList[0].(*model.StoreMap) - if setSyncStatus != 0 { - dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus) - } - if _, err = v.proxySyncStoreSku(ctx, task, storeMap, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil { - globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err) + if syncDisabled || storeMap.Status > model.StoreStatusDisabled { + if setSyncStatus != 0 { + dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus) + } + if _, err = v.proxySyncStoreSku(ctx, task, storeMap, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil { + globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err) + } } return nil, err }, loopMapInfo.StoreMapList) @@ -387,18 +389,6 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, db *dao.DaoDB, vend return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID) }, isContinueWhenError) if task != nil { - // if vendorErr := partner.IsErrChangePriceFailed(task.GetOriginalErr()); vendorErr != nil { - // platformList := make([]string, len(task.GetDetailErrList())) - // for k, v := range task.GetDetailErrList() { - // if vendorErr := partner.IsErrVendorError(v); vendorErr != nil { - // platformList[k] = model.VendorChineseNames[vendorErr.VendorID()] - // } else { - // platformList[k] = "未知" - // } - // } - // err = fmt.Errorf("同步价格失败\n失败平台:%s", strings.Join(platformList, ",")) - // } else { - // } err = makeSyncError(err) } return hint, err @@ -409,36 +399,22 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendo if isForce { setSyncStatus = model.SyncFlagStoreSkuModifiedMask } - return v.SyncStoresSkus2(ctx, db, vendorIDs, storeIDs, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError) + return v.SyncStoresSkus2(ctx, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError) } -// func isUseOldSyncLogic(storeMap *model.StoreMap) bool { -// return false -// return globals.IsProductEnv() && storeMap.StoreID != 102652 // 绿城四季鲜店 -// } - func (v *VendorSync) proxySyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, nameIDs, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - // if isUseOldSyncLogic(storeMap) { - // return v.GetStoreHandler(storeMap.VendorID).(partner.ISingleStoreHandler).SyncStoreCategory(ctx, parentTask, storeMap.StoreID, isAsync) - // } return SyncStorCategories(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, isAsync, isContinueWhenError) } func (v *VendorSync) proxySyncStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { - // if isUseOldSyncLogic(storeMap) { - // return v.GetStoreHandler(storeMap.VendorID).SyncStoreSkus(ctx, parentTask, storeMap.StoreID, skuIDs, isAsync, isContinueWhenError) - // } return SyncStoreSkuNew(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, excludeSkuIDs, isAsync, isContinueWhenError) } func (v *VendorSync) proxyFullSyncStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (hint string, err error) { - // if isUseOldSyncLogic(storeMap) { - // return v.GetStoreHandler(storeMap.VendorID).FullSyncStoreSkus(ctx, parentTask, storeMap.StoreID, isAsync, isContinueWhenError) - // } return FullSyncStoreSkuNew(ctx, parentTask, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, isAsync, isContinueWhenError) } -func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { +func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled, isAsync, isContinueWhenError bool) (hint string, err error) { globals.SugarLogger.Debug("FullSyncStoresSkus") hint, err = v.LoopStoresMap(ctx, db, fmt.Sprintf("初始化门店商品信息:%v", storeIDs), isAsync, true, vendorIDs, storeIDs, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { @@ -452,8 +428,10 @@ func (v *VendorSync) FullSyncStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, v tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeMap := batchItemList[0].(*model.StoreMap) - if _, err = v.proxyFullSyncStoreSku(ctx, task, storeMap, false, isContinueWhenError); err != nil { - globals.SugarLogger.Debugf("FullSyncStoresSkus failed2 store:%d failed with error:%v", storeMap.StoreID, err) + if syncDisabled || storeMap.Status > model.StoreStatusDisabled { + if _, err = v.proxyFullSyncStoreSku(ctx, task, storeMap, false, isContinueWhenError); err != nil { + globals.SugarLogger.Debugf("FullSyncStoresSkus failed2 store:%d failed with error:%v", storeMap.StoreID, err) + } } return nil, err }, loopMapInfo.StoreMapList) diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 8f62f7f92..807ba34a5 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -124,12 +124,12 @@ func doDailyWork() { globals.SugarLogger.Debug("doDailyWork") cms.SyncStoresCourierInfo(jxcontext.AdminCtx, nil, false, true) netprinter.RebindAllPrinters(jxcontext.AdminCtx, false, true) - // cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, true, true) + // cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, false, true, true) - cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, nil, []int{27379}, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true) + cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDJD}, nil, false, nil, []int{27379}, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true) SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID) - taskID, _ := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDEBAI, model.VendorIDMTWM}, nil, nil, nil, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true) + taskID, _ := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDEBAI, model.VendorIDMTWM}, nil, false, nil, nil, model.SyncFlagSaleMask|model.SyncFlagPriceMask, true, true) SaveImportantTaskID(TaskNameSyncStoreSku, taskID) InitEx() diff --git a/controllers/cms_sync.go b/controllers/cms_sync.go index 079ae7e04..687264cb2 100644 --- a/controllers/cms_sync.go +++ b/controllers/cms_sync.go @@ -115,7 +115,7 @@ func (c *SyncController) FullSyncStoresSkus() { if err = jxutils.Strings2Objs(params.StoreIDs, &storeIDs, params.VendorIDs, &vendorIDs); err != nil { return retVal, "", err } - retVal, err = cms.CurVendorSync.FullSyncStoresSkus(params.Ctx, db, vendorIDs, storeIDs, params.IsAsync, params.IsContinueWhenError) + retVal, err = cms.CurVendorSync.FullSyncStoresSkus(params.Ctx, db, vendorIDs, storeIDs, true, params.IsAsync, params.IsContinueWhenError) return retVal, "", err }) } From e587723cf5810d5b745d0962b77b4c9608f175ca Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 31 Oct 2019 11:10:59 +0800 Subject: [PATCH 48/50] +GetWeimobToken --- .../eventhub/syseventhub/syseventhub.go | 22 +++++- business/jxutils/tasks/configrefresh.go | 68 +++++++++++-------- conf/app.conf | 5 +- controllers/sys.go | 17 +++++ globals/globals.go | 2 + routers/commentsRouter_controllers.go | 9 +++ 6 files changed, 91 insertions(+), 32 deletions(-) diff --git a/business/jxutils/eventhub/syseventhub/syseventhub.go b/business/jxutils/eventhub/syseventhub/syseventhub.go index 6e892522a..528c76973 100644 --- a/business/jxutils/eventhub/syseventhub/syseventhub.go +++ b/business/jxutils/eventhub/syseventhub/syseventhub.go @@ -13,8 +13,9 @@ import ( const ( EventCategory = "sys" - EventTypeWXToken = "wxtoken" - EventTypeYLYToken = "ylytoken" + EventTypeWXToken = "wxToken" + EventTypeYLYToken = "ylyToken" + EventTypeWeimobToken = "weimobToken" ) type Hub struct { @@ -63,6 +64,13 @@ func (h *Hub) OnNewYLYToken(token string) { }) } +func (h *Hub) OnNewWeimobToken(token string) { + h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{ + Type: EventTypeWeimobToken, + Data: token, + }) +} + func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { var token string switch tokenType { @@ -70,6 +78,10 @@ func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (toke token = api.WeixinAPI.CBGetToken() case EventTypeYLYToken: token = api.YilianyunAPI.GetToken() + case EventTypeWeimobToken: + if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil { + token = string(utils.MustMarshal(weimobToken)) + } } if token != oldToken { tokenInfo = &TokenInfo{ @@ -85,7 +97,7 @@ func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (toke } } } - globals.SugarLogger.Debugf("GetToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + globals.SugarLogger.Debugf("GetToken tokenType:%s tokenInfo:%s", tokenType, utils.Format4Output(tokenInfo, true)) return tokenInfo } @@ -96,3 +108,7 @@ func (h *Hub) GetWXToken(oldToken string, waitTime time.Duration) (tokenInfo *To func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { return h.GetToken(EventTypeYLYToken, oldToken, waitTime) } + +func (h *Hub) GetWeimobToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) { + return h.GetToken(EventTypeWeimobToken, oldToken, waitTime) +} diff --git a/business/jxutils/tasks/configrefresh.go b/business/jxutils/tasks/configrefresh.go index d675a6919..3f66b89b2 100644 --- a/business/jxutils/tasks/configrefresh.go +++ b/business/jxutils/tasks/configrefresh.go @@ -115,19 +115,17 @@ func RefreshWeixinToken() (err error) { if api.WeixinAPI != nil { err = RefreshConfig("wechat", weixinTokenExpires, func() (token string, expireTimeStr string) { globals.SugarLogger.Debugf("RefreshWeixinToken RunMode:%s", beego.BConfig.RunMode) - if globals.IsProductEnv() || beego.BConfig.RunMode == "alpha" { - if globals.IsMainProductEnv() { - if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { - globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) - token = tokenInfo.AccessToken - } else { - globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) - } + if globals.IsMainProductEnv() { + if tokenInfo, err := api.WeixinAPI.CBRetrieveToken(); err == nil { + globals.SugarLogger.Debugf("RefreshWeixinToken tokenInfo:%s", utils.Format4Output(tokenInfo, true)) + token = tokenInfo.AccessToken } else { - if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil { - expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) - token = tokenInfo.Token - } + globals.SugarLogger.Errorf("RefreshWeixinToken RefreshToken failed with error:%v", err) + } + } else { + if tokenInfo := getWXTokenFromRemote(api.WeixinAPI.CBGetToken()); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires)) + token = tokenInfo.Token } } return token, expireTimeStr @@ -142,17 +140,28 @@ func RefreshWeixinToken() (err error) { func RefreshWeimobToken() (err error) { if api.WeimobAPI != nil { - err = RefreshConfig("weimob", weimobTokenExpires, func() (string, string) { + err = RefreshConfig("weimob", weimobTokenExpires, func() (token string, expireTimeStr string) { + globals.SugarLogger.Debugf("RefreshWeimobToken RunMode:%s", beego.BConfig.RunMode) if globals.IsMainProductEnv() { if tokenInfo, err := api.WeimobAPI.RefreshTokenByRefreshToken(); err == nil { return string(utils.MustMarshal(tokenInfo)), utils.Time2Str(time.Now().Add((time.Duration(tokenInfo.ExpiresIn) - weimobTokenExpires/time.Second) * time.Second)) } + } else { + curToken := "" + if tokenInfo := api.WeimobAPI.GetToken(); tokenInfo != nil { + curToken = string(utils.MustMarshal(tokenInfo)) + } + if tokenInfo := getWeimobTokenFromRemote(curToken); tokenInfo != nil { + expireTimeStr = utils.Time2Str(time.Now().Add(-weimobTokenExpires)) + token = tokenInfo.Token + } } - return "", "" + return token, expireTimeStr }, func(value string) { var tokenInfo *weimobapi.TokenInfo err := utils.UnmarshalUseNumber([]byte(value), &tokenInfo) if err == nil { + syseventhub.SysEventHub.OnNewWeimobToken(string(utils.MustMarshal(tokenInfo))) api.WeimobAPI.SetToken(tokenInfo) } }) @@ -216,19 +225,6 @@ func RefreshYilianyunToken() (err error) { }) } -func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { - if IsGetWXTokenFromRemote() { - tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ - "oldToken": oldToken, - }) - } - return tokenInfo -} - -func IsGetWXTokenFromRemote() bool { - return !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" -} - func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]interface{}) (tokenInfo *syseventhub.TokenInfo) { if waitSecond == 0 { waitSecond = 5 * 60 @@ -272,6 +268,15 @@ func PollingRemotEvent(remoteURL string, waitSecond int, params map[string]inter return tokenInfo } +func getWXTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} + func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" { tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{ @@ -280,3 +285,12 @@ func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { } return tokenInfo } + +func getWeimobTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) { + if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeimobTokenURL != "" { + tokenInfo = PollingRemotEvent(globals.GetWeimobTokenURL, 0, map[string]interface{}{ + "oldToken": oldToken, + }) + } + return tokenInfo +} diff --git a/conf/app.conf b/conf/app.conf index c5a5e8de9..692e5d9b2 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -118,8 +118,8 @@ weixinToken = "17_roSCZgkCxhRnyFVtei0KdfHwdGP8PmLzJFhCieka4_X4_d-lgfaTxF6oIS6FE5 dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" -getWeixinTokenURL = "http://beta.jxc4.com/v2/sys/GetWXToken" -getYLYTokenURL = "http://beta.jxc4.com/v2/sys/GetYLYToken" +getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getYLYTokenURL = "http://www.jxc4.com/v2/sys/GetYLYToken" [prod] EnableDocs = false @@ -311,5 +311,6 @@ weixinMiniAppID2 = "wx4b5930c13f8b1170" weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" +getWeimobTokenURL = "http://www.jxc4.com/v2/sys/GetWeimobToken" dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8mb4&loc=Local&parseTime=true" diff --git a/controllers/sys.go b/controllers/sys.go index 26ad57cce..4e4b66a0e 100644 --- a/controllers/sys.go +++ b/controllers/sys.go @@ -54,6 +54,23 @@ func (c *SysController) GetYLYToken() { }) } +// @Title 得到微盟token +// @Description 得到微盟token +// @Param accessKey query string true "假token" +// @Param oldToken query string false "之前的token" +// @Param waitSecond query int false "等待秒数" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetWeimobToken [get] +func (c *SysController) GetWeimobToken() { + c.callGetWeimobToken(func(params *tSysGetWeimobTokenParams) (retVal interface{}, errCode string, err error) { + if params.AccessKey == globals.GetWeixinTokenKey { + retVal = syseventhub.SysEventHub.GetWeimobToken(params.OldToken, time.Duration(params.WaitSecond)*time.Second) + } + return retVal, "", err + }) +} + // @Title 得到饿百RTF转换内容 // @Description 得到饿百RTF转换内容 // @Param imgListStr query string true "逗号分隔的图片列表可以是转义后的" diff --git a/globals/globals.go b/globals/globals.go index 3bd30d243..e615981b0 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -41,6 +41,7 @@ var ( GetWeixinTokenURL string GetWeixinTokenKey string GetYLYTokenURL string + GetWeimobTokenURL string StoreName string @@ -84,6 +85,7 @@ func Init() { GetWeixinTokenURL = beego.AppConfig.DefaultString("getWeixinTokenURL", "") GetYLYTokenURL = beego.AppConfig.DefaultString("getYLYTokenURL", "") + GetWeimobTokenURL = beego.AppConfig.DefaultString("getWeimobTokenURL", "") GetWeixinTokenKey = beego.AppConfig.DefaultString("getWeixinTokenKey", "") StoreName = beego.AppConfig.DefaultString("storeName", "京西菜市") diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 6cec894c6..fad661d86 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -1647,6 +1647,15 @@ func init() { 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: "GetWeimobToken", + Router: `/GetWeimobToken`, + AllowHTTPMethods: []string{"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: "GetYLYToken", From af4444648eea9d2eb6c91038e73f24048f843287 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 31 Oct 2019 11:13:30 +0800 Subject: [PATCH 49/50] =?UTF-8?q?+weimob=5Forder.go=EF=BC=8C=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E5=BE=AE=E7=9B=9F=E9=9B=86=E4=B8=AD=E4=BE=9B=E8=B4=A7?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=87=AA=E5=8A=A8=E5=85=B3=E6=B3=A8=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=BA=94=E7=9A=84=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E5=95=86=E5=93=81=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/cs/weimob_order.go | 68 ++++++++++++++++++++++++++++++++++ controllers/weimob_callback.go | 10 +++-- 2 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 business/cs/weimob_order.go diff --git a/business/cs/weimob_order.go b/business/cs/weimob_order.go new file mode 100644 index 000000000..e5d89e979 --- /dev/null +++ b/business/cs/weimob_order.go @@ -0,0 +1,68 @@ +package cs + +import ( + "git.rosy.net.cn/baseapi/platformapi/weimobapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxstore/cms" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" +) + +const ( + minCSOrderPayment = 0 // 供货订单的最小金额 + maxUnitPrice = 3000 // 为防止误填单价,限制单价最高 +) + +func OnCallbackMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) { + orderID := utils.Int64ToStr(msg.OrderNo) + jxutils.CallMsgHandler(func() { + response = onOrderMsg(msg) + }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDWSC)) + return response +} + +func onOrderMsg(msg *weimobapi.CallbackMsg) (response *weimobapi.CallbackResponse) { + if msg.Event == weimobapi.MsgEventOrderStatusChange { + if orderDetail, err := api.WeimobAPI.QueryOrderDetail2(msg.OrderNo, false); err == nil { + if orderDetail.OrderStatus == weimobapi.OrderStatusFinished && orderDetail.PaymentAmount >= minCSOrderPayment { + changeStoreSkusByOrder(orderDetail) + } + } + } + return response +} + +func changeStoreSkusByOrder(order *weimobapi.OrderDetail) { + receiverMobile := order.DeliveryDetail.LogisticsDeliveryDetail.ReceiverMobile + storeList, err := dao.GetStoreList(dao.GetDB(), nil, []string{receiverMobile}, "") + if err != nil { + if len(storeList) == 1 { + var skuBindInfos []*cms.StoreSkuBindInfo + storeID := storeList[0].ID + for _, v := range order.ItemList { + nameID := int(utils.Str2Int64WithDefault(v.SkuCode, 0)) + unitPrice := v.OriginalPrice + if nameID > 0 && (unitPrice > 0 && unitPrice < maxUnitPrice) { + skuBindInfos = append(skuBindInfos, &cms.StoreSkuBindInfo{ + StoreID: storeID, + NameID: nameID, + UnitPrice: int(jxutils.StandardPrice2Int(unitPrice)), + IsFocus: 1, + IsSale: 1, + }) + } else { + globals.SugarLogger.Infof("[运营],微商城订单:%s,商品:%s没有设置正确的SkuName编码或单价,当前商家编码:%s,市场价:%s", order.OrderNo, v.SkuNum, v.SkuCode, jxutils.IntPrice2StandardString(jxutils.StandardPrice2Int(unitPrice))) + } + } + if len(skuBindInfos) > 0 { + cms.UpdateStoreSkus(jxcontext.NewWithUserName(nil, utils.LimitStringLen(utils.Int64ToStr(order.OrderNo), 32), nil, nil), storeID, skuBindInfos, true, true) + } + } else { + globals.SugarLogger.Infof("[运营],微商城订单:%s,手机:%s找不到唯一一个京西门店%d", order.OrderNo, receiverMobile, len(storeList)) + } + } +} diff --git a/controllers/weimob_callback.go b/controllers/weimob_callback.go index 8e8123ad7..7989ae264 100644 --- a/controllers/weimob_callback.go +++ b/controllers/weimob_callback.go @@ -3,6 +3,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/weimobapi" "git.rosy.net.cn/jx-callback/business/jxutils/tasks" + "git.rosy.net.cn/jx-callback/business/cs" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" @@ -15,10 +16,11 @@ type WeimobController struct { func (c *WeimobController) onCallbackMsg() { if true { //c.Ctx.Input.Method() == http.MethodPost { callbackResponse := weimobapi.SuccessResponse - // msg, callbackResponse := api.WeimobAPI.GetCallbackMsg(c.Ctx.Input.RequestBody) - // if callbackResponse == nil { - // callbackResponse = wsc.OnCallbackMsg(msg) - // } + msg, callbackResponse := api.WeimobAPI.GetCallbackMsg(c.Ctx.Input.RequestBody) + if callbackResponse == nil { + // callbackResponse = wsc.OnCallbackMsg(msg) + callbackResponse = cs.OnCallbackMsg(msg) + } c.Data["json"] = callbackResponse c.ServeJSON() } else { From 5dc67bcd9ed8e8b24ef1c2fff45419af82c9d7ff Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 31 Oct 2019 11:25:45 +0800 Subject: [PATCH 50/50] disableWeimob = false for beta --- conf/app.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/app.conf b/conf/app.conf index 692e5d9b2..608ab9764 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -310,6 +310,7 @@ weixinSecret = "6bbbed1443cc062c20a015a64c07a531" weixinMiniAppID2 = "wx4b5930c13f8b1170" weixinMiniSecret2 = "2a57228a716ce991a52739f0ff41111d" +disableWeimob = false getWeixinTokenURL = "http://www.jxc4.com/v2/sys/GetWXToken" getWeimobTokenURL = "http://www.jxc4.com/v2/sys/GetWeimobToken"